You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:03:21