Files
ZelWiki/ZelWiki.Repository/SecurityRepository.cs
2025-02-23 18:47:21 +08:00

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)));
}
}
}
}