I created a new project using a .NET 9 Blazor Web App template.And followed the documentation for adding the authentication state provider.
My understanding from the documentation is that the all I need to do is add builder.Services.AddCascadingAuthenticationState();
to my Program.cs which I did.
I am not using a custom AuthenticationStateProvider.
Then I should simply be able to cascade the authentication state into my page.[CascadingParameter] private Task<AuthenticationState>? authenticationState { get; set; }
Then await during my OnInitializedAsync()
to receive my current users identity.
protected override async Task OnInitializedAsync(){ if (authenticationState is null) { authMessage = "Unable to determine authentication state."; return; } var authState = await authenticationState; var user = authState?.User; if (user?.Identity is not null && user.Identity.IsAuthenticated) { authMessage = $"{user.Identity.Name} is authenticated."; } else { authMessage = "The user is NOT authenticated."; }}
However IsAuthenticated
always equals false. This is problematic because I have a two .NET 7 Blazor Server apps that were upgraded to .NET 8 that use cascading authentication. And they are able to receive the authenticated user via the authentication state.
What I have tried is adding more services to in my Program.cs
builder.Services.AddAuthorization();builder.Services.AddAuthorizationCore();builder.Services.AddCascadingAuthenticationState();
This had no effect.
I ensured the launchSettings.json
Windows authentication is true and anonymous is false to match my other projects.
"iisSettings": {"windowsAuthentication": true,"anonymousAuthentication": false,"iisExpress": {"applicationUrl": "http://localhost:50496","sslPort": 44397 }
I tried wrapping the Routes.razor
with the cascading authentication state.Which if my understanding of the documentation is correct. Shouldn't be necessary.
<Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState><Router AppAssembly="typeof(Program).Assembly"><Found Context="routeData"><RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" /><FocusOnNavigate RouteData="routeData" Selector="h1" /></Found></Router></Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState>
I then also tried wrapping the App.razor
in the cascading authentication state. I tried this because this is where in my other functional apps the cascading authentication state is located.
<Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState><!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><base href="/" /><HeadOutlet @rendermode="@InteractiveServer" /></head><body class="k-body"><Routes @rendermode="@InteractiveServer" /><script src="_framework/blazor.web.js" autostart="false"></script><script> document.addEventListener("DOMContentLoaded", function() { Blazor.start(); });</script></body></html></Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState>
I expected that one of these changes would lead to user.Identity.IsAuthenticated
to be true.But I am still unable to successfully configure my projects authentication state.
However I can retrieve the Name value if I use this method.var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
This variation works albeit only for Windows systems.