From 1cef5c00637c1dde2efd68c1a57b6b888939a7f0 Mon Sep 17 00:00:00 2001 From: Peace Date: Thu, 8 Aug 2024 16:51:31 +0900 Subject: [PATCH] resolving auth problem --- .../FluentBlazorAuth/Components/App.razor | 2 +- .../Components/Layout/MainLayout.razor | 4 ++ .../Components/Pages/Account/Login.razor | 66 +++++++++++-------- .../Components/Pages/Counter.razor | 24 +++++++ .../FluentBlazorAuth/Components/Routes.razor | 2 +- .../FluentBlazorAuth/FluentBlazorAuth.csproj | 1 + .../Models/ViewModels/LoginViewModel.cs | 4 +- .../FluentBlazorAuth/Program.cs | 5 ++ .../CustomAuthenticationStateProvider.cs | 25 +++++++ 9 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/States/CustomAuthenticationStateProvider.cs diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/App.razor b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/App.razor index 4b64f5d..f1f9f4c 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/App.razor +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/App.razor @@ -15,7 +15,7 @@ - + diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Layout/MainLayout.razor b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Layout/MainLayout.razor index 5d01915..5939f45 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Layout/MainLayout.razor +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Layout/MainLayout.razor @@ -28,6 +28,10 @@ + + + +
An unhandled error has occurred. Reload diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Account/Login.razor b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Account/Login.razor index e0cf2a7..937be53 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Account/Login.razor +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Account/Login.razor @@ -4,31 +4,38 @@ @using System.Security.Claims @using Microsoft.AspNetCore.Authentication @using Microsoft.AspNetCore.Authentication.Cookies -@inject AppDbContext AppDbContext; -@inject NavigationManager NavManager; -@rendermode InteractiveServer +@inject AppDbContext AppDbContext +@inject NavigationManager NavManager - - - - + + + + + + Login + + + + - -
- - -
-
- - -
-
- @errorMessage?.ToString() -
- Login + +
+ + +
+
+ + +
+
+ @errorMessage?.ToString() +
+ Login +
+
-
+
@@ -37,22 +44,29 @@ public HttpContext? HttpContext { get; set; } [SupplyParameterFromForm] - public LoginViewModel Model { get; set; } = new LoginViewModel(); - + public LoginViewModel LoginViewModel { get; set; } + string? errorMessage; + protected override void OnInitialized() + { + base.OnInitialized(); + LoginViewModel = new LoginViewModel(); + } + async Task OnLoginSubmit(EditContext context) { - var userAccount = AppDbContext.UserAccounts.Where(u => u.UserName == Model.UserName).FirstOrDefault(); - if (userAccount is null || userAccount.Password != Model.Password) + var userAccount = AppDbContext.UserAccounts.Where(u => u.UserName == LoginViewModel.UserName).FirstOrDefault(); + if (userAccount is null || userAccount.Password != LoginViewModel.Password) { errorMessage = "Please login again."; + await InvokeAsync(StateHasChanged); return; } var claims = new List { - new Claim(ClaimTypes.Name, Model.UserName), + new Claim(ClaimTypes.Name, LoginViewModel.UserName), new Claim(ClaimTypes.Role, userAccount.Role) }; diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Counter.razor b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Counter.razor index bc892df..25f653b 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Counter.razor +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Pages/Counter.razor @@ -1,4 +1,5 @@ @page "/counter" +@inject IToastService ToastService @rendermode InteractiveServer Counter @@ -11,11 +12,34 @@ Click me +
+ + + Check Authentication + + + @code { + [CascadingParameter] + private Task AuthenticationStateTask { get; set; } + private int currentCount = 0; private void IncrementCount() { currentCount++; } + + private async void ShowToast() + { + var authState = await AuthenticationStateTask; + if (authState.User.Identity.IsAuthenticated == false) + { + ToastService.ShowError("Not authorized.", 5000); + return; + } + + var message = $"Hello, {authState.User.Identity.Name}"; + ToastService.ShowInfo(message, 5000); + } } diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Routes.razor b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Routes.razor index f756e19..b9351ec 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Routes.razor +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Components/Routes.razor @@ -1,6 +1,6 @@  - + diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth.csproj b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth.csproj index b015a6c..8d8c85f 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth.csproj +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth.csproj @@ -7,6 +7,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Models/ViewModels/LoginViewModel.cs b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Models/ViewModels/LoginViewModel.cs index 88354b0..7094525 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Models/ViewModels/LoginViewModel.cs +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Models/ViewModels/LoginViewModel.cs @@ -5,9 +5,9 @@ namespace FluentBlazorAuth.Models.ViewModels public class LoginViewModel { [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter the user name.")] - public string? UserName { get; set; } + public string? UserName { get; set; } = string.Empty; [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter the password.")] - public string? Password { get; set; } + public string? Password { get; set; } = string.Empty; } } \ No newline at end of file diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Program.cs b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Program.cs index 8258a68..60ff998 100644 --- a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Program.cs +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/Program.cs @@ -3,6 +3,7 @@ using FluentBlazorAuth.Components; using Microsoft.AspNetCore.Authentication.Cookies; using FluentBlazorAuth.Data; using Microsoft.EntityFrameworkCore; +using Blazored.LocalStorage; namespace FluentBlazorAuth; @@ -30,6 +31,10 @@ public class Program builder.Services.AddCascadingAuthenticationState(); #endregion + #region LocalStorage + builder.Services.AddBlazoredLocalStorage(); + #endregion + #region Database var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddDbContext(options => diff --git a/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/States/CustomAuthenticationStateProvider.cs b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/States/CustomAuthenticationStateProvider.cs new file mode 100644 index 0000000..d23a610 --- /dev/null +++ b/FluentBlazorAuth/FluentBlazorAuth/FluentBlazorAuth/States/CustomAuthenticationStateProvider.cs @@ -0,0 +1,25 @@ +using Blazored.LocalStorage; +using Microsoft.AspNetCore.Components.Authorization; +using System.Security.Claims; + +namespace FluentBlazorAuth.States +{ + public class CustomAuthenticationStateProvider : AuthenticationStateProvider + { + private readonly ILocalStorageService _localStorage; + + public CustomAuthenticationStateProvider(ILocalStorageService localStorage) + { + _localStorage = localStorage; + } + + public override async Task GetAuthenticationStateAsync() + { + var token = await _localStorage.GetItemAsync("authToken"); + if (string.IsNullOrWhiteSpace(token)) + return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); + + return null; + } + } +}