Blazor Server App如何强制Windows AD用户每次请求重新授权?
Blazor Server Windows认证用户缓存问题解决方法
你的Blazor Server应用采用Windows AD(Negotiate)认证,但存在用户身份缓存问题——后续用户无需登录就会被识别为上一位登录的用户。这是因为默认的ServerAuthenticationStateProvider会缓存认证状态,且Blazor Server的长连接(Circuit)机制可能复用了之前的身份信息。以下是针对性的解决方法:
1. 自定义AuthenticationStateProvider,强制每次请求重新获取身份
创建自定义认证状态提供器,绕过默认缓存逻辑,直接从当前请求的HttpContext中获取Windows用户身份:
using Microsoft.AspNetCore.Components.Server; using Microsoft.AspNetCore.Components.Authorization; using System.Security.Claims; using Microsoft.AspNetCore.Http; public class WindowsAuthStateProvider : ServerAuthenticationStateProvider { private readonly IHttpContextAccessor _httpContextAccessor; public WindowsAuthStateProvider(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public override Task<AuthenticationState> GetAuthenticationStateAsync() { var httpContext = _httpContextAccessor.HttpContext; if (httpContext?.User?.Identity is ClaimsIdentity identity && identity.IsAuthenticated) { return Task.FromResult(new AuthenticationState(new ClaimsPrincipal(identity))); } return Task.FromResult(new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()))); } }
在Program.cs中注册这个自定义提供器,替换默认实现:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); builder.Services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); }); // 注册自定义认证状态提供器及HttpContextAccessor builder.Services.AddScoped<AuthenticationStateProvider, WindowsAuthStateProvider>(); builder.Services.AddHttpContextAccessor();
2. 配置Blazor Server禁用Circuit身份缓存
在Program.cs中添加Blazor配置,强制每个新Circuit连接都重新验证身份:
builder.Services.AddServerSideBlazor(options => { // 设置缓存时长为0,禁用身份状态缓存 options.AuthenticationStateCacheDuration = TimeSpan.Zero; });
3. 检查服务器托管配置(以IIS为例)
如果应用部署在IIS上,需调整以下配置避免进程级身份缓存:
- 禁用内核模式认证:进入IIS站点的认证设置,打开Windows认证的「高级设置」,取消勾选「启用内核模式认证」。内核模式会在进程级别缓存用户身份,导致不同用户共享身份信息。
- 调整应用程序池:确保应用程序池设置为「每个请求一个工作进程」,或禁用进程内缓存选项。
验证方式
修改完成后,每次新用户打开应用时,调用AuthenticationStateProvider.GetAuthenticationStateAsync()都会返回当前请求对应的Windows用户身份,而非缓存的上一位用户信息。
内容的提问来源于stack exchange,提问作者CsharpSqlGuy
相关产品推荐
相关产品推荐

