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 @@
-
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;
+ }
+ }
+}