Skip to content

Commit

Permalink
Merge pull request #11 from V1ck3s/refactoring
Browse files Browse the repository at this point in the history
Refactoring and some fixes
  • Loading branch information
V1ck3s authored Oct 20, 2023
2 parents c6f6f3e + 5753d82 commit 4df8599
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 95 deletions.
2 changes: 1 addition & 1 deletion App.razor
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</AuthorizeRouteView>
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<PageTitle>Not found - PartyGameTime</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
Expand Down
147 changes: 131 additions & 16 deletions Core/Auth/AccountManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Security.Claims;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using PartyGameTime.Core.Model;
Expand All @@ -7,20 +9,68 @@ namespace PartyGameTime.Core.Auth;

public class AccountManager
{
private readonly UserManager<Account> _account;
private readonly UserManager<Account> _userManager;
private readonly RoleManager<AccountRole> _accountRole;
private readonly SignInManager<Account> _signInManager;
private readonly NavigationManager _navigationManager;
private readonly AuthenticationStateProvider _authenticationStateProvider;

public AccountManager(UserManager<Account> account, RoleManager<AccountRole> accountRole, SignInManager<Account> signInManager, NavigationManager navigationManager)
public AccountManager(UserManager<Account> account, RoleManager<AccountRole> accountRole, SignInManager<Account> signInManager, NavigationManager navigationManager, AuthenticationStateProvider authenticationStateProvider)
{
_account = account;
_userManager = account;
_accountRole = accountRole;
_signInManager = signInManager;
_navigationManager = navigationManager;
_authenticationStateProvider = authenticationStateProvider;
Initialize();
}

private AuthenticationState? _authenticationState;
private ClaimsPrincipal? _user;
private string _userId;
private Core.Model.Account _account;

private async void Initialize()
{
if ((_account is null || _user is null || _authenticationState is null))
{
_authenticationState = await _authenticationStateProvider.GetAuthenticationStateAsync();
_user = _authenticationState.User;
if (_user?.Identity != null && _user.Identity.IsAuthenticated)
{
_userId = _user.FindFirstValue(ClaimTypes.NameIdentifier);
if (_userId is not null)
{
_account = await GetAccount(_userId);
}
}
}
}

public async Task<string> GetCurrentUserUsername()
{
if (_user?.Identity?.Name is not null)
{
return _user.Identity.Name;
}

return null;
}

public async Task<string> GetCurrentUserId()
{
return _userId;
}

public async Task<string> GetCurrentUserEmail()
{
return _account.Email ?? string.Empty;
}

public async Task SetCurrentUserEmail(string email)
{
_account.Email = email;
}

public async Task SignOut()
{
Expand All @@ -29,7 +79,7 @@ public async Task SignOut()

public async Task<IdentityResult> CreateAccount(Account account, string password)
{
var result = await _account.CreateAsync(account, password);
var result = await _userManager.CreateAsync(account, password);
if (result.Succeeded)
{
return result;
Expand All @@ -51,7 +101,7 @@ public async Task<IdentityResult> CreateRole(AccountRole role)

public async Task<IdentityResult> AddRoleToAccount(Account account, string role)
{
var result = await _account.AddToRoleAsync(account, role);
var result = await _userManager.AddToRoleAsync(account, role);
if (result.Succeeded)
{
return result;
Expand All @@ -62,7 +112,7 @@ public async Task<IdentityResult> AddRoleToAccount(Account account, string role)

public async Task<IdentityResult> RemoveRoleFromAccount(Account account, string role)
{
var result = await _account.RemoveFromRoleAsync(account, role);
var result = await _userManager.RemoveFromRoleAsync(account, role);
if (result.Succeeded)
{
return result;
Expand All @@ -73,7 +123,7 @@ public async Task<IdentityResult> RemoveRoleFromAccount(Account account, string

public async Task<IdentityResult> DeleteAccount(Account account)
{
var result = await _account.DeleteAsync(account);
var result = await _userManager.DeleteAsync(account);
if (result.Succeeded)
{
return result;
Expand All @@ -95,7 +145,7 @@ public async Task<IdentityResult> DeleteRole(AccountRole role)

public async Task<Account> GetAccount(string id)
{
var account = await _account.FindByIdAsync(id);
var account = await _userManager.FindByIdAsync(id);
if (account != null)
{
return account;
Expand All @@ -106,14 +156,24 @@ public async Task<Account> GetAccount(string id)

public async Task<Account> GetAccountByName(string name)
{
var account = await _account.FindByNameAsync(name);
var account = await _userManager.FindByNameAsync(name);
if (account != null)
{
return account;
}

return null;
}

public async Task<bool> CanSignInAsync(Account account)
{
return await _signInManager.CanSignInAsync(account);
}

public async Task<SignInResult> CheckPasswordSignInAsync(Account account, string password, bool lockoutOnFailure)
{
return await _signInManager.CheckPasswordSignInAsync(account, password, lockoutOnFailure);
}

public async Task<AccountRole> GetRole(string id)
{
Expand All @@ -139,7 +199,7 @@ public async Task<AccountRole> GetRoleByName(string name)

public async Task<IList<string>> GetRoles(Account account)
{
var roles = await _account.GetRolesAsync(account);
var roles = await _userManager.GetRolesAsync(account);
if (roles != null)
{
return roles;
Expand All @@ -150,7 +210,7 @@ public async Task<IList<string>> GetRoles(Account account)

public async Task<IList<Account>> GetAccountsInRole(string role)
{
var accounts = await _account.GetUsersInRoleAsync(role);
var accounts = await _userManager.GetUsersInRoleAsync(role);
if (accounts != null)
{
return accounts;
Expand All @@ -161,7 +221,7 @@ public async Task<IList<Account>> GetAccountsInRole(string role)

public async Task<IList<Account>> GetAccounts()
{
var accounts = await _account.Users.ToListAsync();
var accounts = await _userManager.Users.ToListAsync();
if (accounts != null)
{
return accounts;
Expand All @@ -183,7 +243,18 @@ public async Task<IList<AccountRole>> GetRoles()

public async Task<IdentityResult> UpdateAccount(Account account)
{
var result = await _account.UpdateAsync(account);
var result = await _userManager.UpdateAsync(account);
if (result.Succeeded)
{
return result;
}

return null;
}

public async Task<IdentityResult> UpdateCurrentAccount()
{
var result = await _userManager.UpdateAsync(_account);
if (result.Succeeded)
{
return result;
Expand All @@ -205,7 +276,18 @@ public async Task<IdentityResult> UpdateRole(AccountRole role)

public async Task<IdentityResult> ChangePassword(Account account, string currentPassword, string newPassword)
{
var result = await _account.ChangePasswordAsync(account, currentPassword, newPassword);
var result = await _userManager.ChangePasswordAsync(account, currentPassword, newPassword);
if (result.Succeeded)
{
return result;
}

return null;
}

public async Task<IdentityResult> ChangePasswordCurrentUser(string currentPassword, string newPassword)
{
var result = await _userManager.ChangePasswordAsync(_account, currentPassword, newPassword);
if (result.Succeeded)
{
return result;
Expand All @@ -214,10 +296,43 @@ public async Task<IdentityResult> ChangePassword(Account account, string current
return null;
}

public async Task<bool> Checkpassword(Account account, string password)
public async Task<bool> CheckPassword(Account account, string password)
{
var result = await _account.CheckPasswordAsync(account, password);
var result = await _userManager.CheckPasswordAsync(account, password);
return result;
}

public async Task<bool> CheckPasswordCurrentUser(string password)
{
var result = await _userManager.CheckPasswordAsync(_account, password);
return result;
}

public async Task<IEnumerable<string>> CheckPasswordStrength(string password)
{

List<string> passwordErrors = new List<string>();

var validators = _userManager.PasswordValidators;

foreach(var validator in validators)
{
var result = await validator.ValidateAsync(_userManager, null, password);

if (!result.Succeeded)
{
foreach (var error in result.Errors)
{
passwordErrors.Add(error.Description);
}
}
}
return passwordErrors;
}

public async Task<bool> CheckPasswordStrengthValid(string password)
{
IEnumerable<string> errors = await CheckPasswordStrength(password);
return !errors.Any();
}
}
53 changes: 30 additions & 23 deletions Pages/Auth/Login.razor
Original file line number Diff line number Diff line change
@@ -1,37 +1,39 @@
@page "/auth/login"
@inject NavigationManager _navigationManager
@inject AccountManager _accountManager
@inject UserManager<Account> _userManager
@inject SignInManager<Account> _signInManager
@inject ISnackbar _snackbar
@using System.Text.RegularExpressions
@using Microsoft.AspNetCore.Identity
@using Microsoft.EntityFrameworkCore.Metadata.Internal
@using PartyGameTime.Core.Model
@layout EmptyLayout
@attribute [AllowAnonymous]

<MudGrid Justify="Justify.Center" Class="pt-16">
<MudItem xs="11" sm="8" md="6" lg="4">
<MudPaper Class="pa-4" Elevation="0" Outlined="true">
<MudGrid Justify="Justify.Center">
<MudItem xs="12" Style="text-align: center;">
<MudText Typo="Typo.h4" Class="mb-4">Sign in</MudText>
</MudItem>
<MudItem xs="12" >
<MudTextField @bind-Value="username" T="string" Variant="Variant.Outlined" Label="Username" Required="true" RequiredError="User name is required !"/>
<MudTextField @bind-Value="password" InputType="InputType.Password" T="string" Variant="Variant.Outlined" Label="Password" Required="true" RequiredError="Password is required !"/>
</MudItem>
<MudItem xs="12" Class="pt-0">
<MudLink>Forgot username ?</MudLink>
<br>
<MudLink>Forgot password ?</MudLink>
</MudItem>
<MudItem xs="12" Class="d-flex justify-space-around flex-grow-1 gap-4">
<MudLink Href="/auth/register/">Create account</MudLink>
<MudForm @ref="form" @bind-IsValid="success">
<MudGrid Justify="Justify.Center">
<MudItem xs="12" Style="text-align: center;">
<MudText Typo="Typo.h4" Class="mb-4">Sign in</MudText>
</MudItem>
<MudItem xs="12" >
<MudTextField @bind-Value="username" T="string" Variant="Variant.Outlined" Label="Username" Required="true" RequiredError="User name is required !" OnKeyDown="@((x) => x.Key.Equals("Enter") ? OnNormalLoginClicked(): null )"/>
<MudTextField @bind-Value="password" InputType="InputType.Password" T="string" Variant="Variant.Outlined" Label="Password" Required="true"
RequiredError="Password is required !" OnKeyDown="@((x) => x.Key.Equals("Enter") ? OnNormalLoginClicked(): null )" />
</MudItem>
<MudItem xs="12" Class="pt-0">
<MudLink>Forgot username ?</MudLink>
<br>
<MudLink>Forgot password ?</MudLink>
</MudItem>
<MudItem xs="12" Class="d-flex justify-space-around flex-grow-1 gap-4">
<MudLink Href="/auth/register/">Create account</MudLink>

<MudButton Variant="Variant.Filled" Color="Color.Primary" DisableElevation="true" Class="ml-auto" OnClick="OnNormalLoginClicked">Sign in</MudButton>
</MudItem>
</MudGrid>
<MudButton Variant="Variant.Filled" Color="Color.Primary" DisableElevation="true" Class="ml-auto" OnClick="OnNormalLoginClicked">Sign in</MudButton>
</MudItem>
</MudGrid>
</MudForm>
</MudPaper>
</MudItem>
</MudGrid>
Expand All @@ -46,17 +48,22 @@

private async Task OnNormalLoginClicked()
{
var usr = await _userManager.FindByNameAsync(username);
await form.Validate();
if (!success)
{
return;
}
var usr = await _accountManager.GetAccountByName(username);
if (usr == null)
{
_snackbar.Add("User not found", Severity.Error);
return;
}


if (await _signInManager.CanSignInAsync(usr))
if (await _accountManager.CanSignInAsync(usr))
{
var result = await _signInManager.CheckPasswordSignInAsync(usr, password, true);
SignInResult result = await _accountManager.CheckPasswordSignInAsync(usr, password, true);
if (result == SignInResult.Success)
{
Guid key = Guid.NewGuid();
Expand Down
Loading

0 comments on commit 4df8599

Please sign in to comment.