96 lines
4.0 KiB
C#
96 lines
4.0 KiB
C#
using Microsoft.AspNetCore.Identity;
|
|
using NTDLS.Helpers;
|
|
using System.Security.Claims;
|
|
using ZelWiki.Library;
|
|
|
|
namespace ZelWiki.Repository
|
|
{
|
|
public static class SecurityRepository
|
|
{
|
|
public static async void ValidateEncryptionAndCreateAdminUser(UserManager<IdentityUser> userManager)
|
|
{
|
|
if (ConfigurationRepository.IsFirstRun())
|
|
{
|
|
UsersRepository.SetAdminPasswordClear();
|
|
}
|
|
|
|
if (UsersRepository.AdminPasswordStatus() == Constants.AdminPasswordChangeState.NeedsToBeSet)
|
|
{
|
|
var user = await userManager.FindByNameAsync(Constants.DEFAULTUSERNAME);
|
|
if (user == null)
|
|
{
|
|
var creationResult = await userManager.CreateAsync(new IdentityUser(Constants.DEFAULTUSERNAME), Constants.DEFAULTPASSWORD);
|
|
if (!creationResult.Succeeded)
|
|
{
|
|
throw new Exception(string.Join("\r\n", creationResult.Errors.Select(o => o.Description)));
|
|
}
|
|
|
|
user = await userManager.FindByNameAsync(Constants.DEFAULTUSERNAME);
|
|
}
|
|
|
|
user.EnsureNotNull();
|
|
|
|
user.Email = Constants.DEFAULTUSERNAME;
|
|
user.EmailConfirmed = true;
|
|
var emailUpdateResult = await userManager.UpdateAsync(user);
|
|
if (!emailUpdateResult.Succeeded)
|
|
{
|
|
throw new Exception(string.Join("\r\n", emailUpdateResult.Errors.Select(o => o.Description)));
|
|
}
|
|
|
|
var membershipConfig = ConfigurationRepository.GetConfigurationEntryValuesByGroupName("Membership");
|
|
|
|
var claimsToAdd = new List<Claim>
|
|
{
|
|
new (ClaimTypes.Role, "Administrator"),
|
|
new ("timezone", membershipConfig.Value<string>("Default TimeZone").EnsureNotNull()),
|
|
new (ClaimTypes.Country, membershipConfig.Value<string>("Default Country").EnsureNotNull()),
|
|
new ("language", membershipConfig.Value<string>("Default Language").EnsureNotNull()),
|
|
};
|
|
|
|
UpsertUserClaims(userManager, user, claimsToAdd);
|
|
|
|
var token = await userManager.GeneratePasswordResetTokenAsync(user.EnsureNotNull());
|
|
var result = await userManager.ResetPasswordAsync(user, token, Constants.DEFAULTPASSWORD);
|
|
if (!result.Succeeded)
|
|
{
|
|
throw new Exception(string.Join("\r\n", emailUpdateResult.Errors.Select(o => o.Description)));
|
|
}
|
|
|
|
UsersRepository.SetAdminPasswordIsDefault();
|
|
|
|
var existingProfileUserId = UsersRepository.GetUserAccountIdByNavigation(Navigation.Clean(Constants.DEFAULTACCOUNT));
|
|
if (existingProfileUserId == null)
|
|
{
|
|
UsersRepository.CreateProfile(Guid.Parse(user.Id), Constants.DEFAULTACCOUNT);
|
|
}
|
|
else
|
|
{
|
|
UsersRepository.SetProfileUserId(Constants.DEFAULTACCOUNT, Guid.Parse(user.Id));
|
|
}
|
|
}
|
|
}
|
|
|
|
public static async void UpsertUserClaims(UserManager<IdentityUser> userManager, IdentityUser user, List<Claim> givenClaims)
|
|
{
|
|
var existingClaims = await userManager.GetClaimsAsync(user);
|
|
|
|
foreach (var givenClaim in givenClaims)
|
|
{
|
|
var firstNameClaim = existingClaims.FirstOrDefault(c => c.Type == givenClaim.Type);
|
|
if (firstNameClaim != null)
|
|
{
|
|
await userManager.RemoveClaimAsync(user, firstNameClaim);
|
|
}
|
|
await userManager.AddClaimAsync(user, givenClaim);
|
|
}
|
|
|
|
var result = await userManager.UpdateAsync(user);
|
|
if (!result.Succeeded)
|
|
{
|
|
throw new Exception(string.Join("<br />\r\n", result.Errors.Select(o => o.Description)));
|
|
}
|
|
}
|
|
}
|
|
}
|