这个问题通常是由于Blazor Server应用程序的实现方式不正确导致的。大多数情况下,问题在于使用了不同的组件和服务来获取身份验证状态,而这些组件并没有共享同一个AuthenticationState对象。
要解决这个问题,可以在Blazor Server应用程序中实现CascadingAuthenticationState。这意味着在应用程序的顶层组件中,您需要将AuthenticationState对象传递给所有子组件和服务。
以下代码示例演示了如何实现CascadingAuthenticationState:
在App.razor文件中添加以下代码:
在Startup.cs文件中的ConfigureServices()方法中添加以下代码:
services.AddScoped
然后,创建ServerAuthenticationStateProvider.cs文件,并添加以下代码:
using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Components.Authorization;
public class ServerAuthenticationStateProvider : AuthenticationStateProvider
{
public async override Task
// 将claims转换为用户标识,并创建新的AuthenticationState对象
var user = new ClaimsPrincipal(new ClaimsIdentity(claims, "jwt"));
return await Task.FromResult(new AuthenticationState(user));
}
}
这个实现将创建一个CascadingAuthenticationState对象,该对象将在整个应用程序中共享AuthenticationState对象。使用ServerAuthenticationStateProvider类生成的AuthenticationState对象即可与GetAuthenticationStateAsync()方法返回的对象匹配。