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

.NET 8 Blazor:单组件启用Windows身份验证,其余允许匿名访问

.NET 8 Blazor InteractiveServer 单个组件域用户权限控制解决方案

问题根源

  1. InteractiveServer渲染的双阶段特性:
    InteractiveServer模式下组件会执行两次渲染:
    • 第一次是初始HTTP请求触发的服务器端渲染,此时HttpContextAccessor能拿到Windows身份(因为请求通过IIS Windows认证传递)。
    • 第二次是SignalR持久连接建立后的实时渲染,这个阶段没有绑定单个HTTP请求,HttpContext不存在,所以HttpContextAccessor获取的User为null。
  2. 双认证模式的策略冲突:
    同时开启匿名和Windows认证时,默认授权策略不会强制要求Windows身份验证,[Authorize]仅检查用户是否已认证,但SignalR连接阶段未传递身份信息,导致第二次渲染时身份丢失。关闭匿名认证后,所有请求强制走Windows认证,SignalR连接也会携带身份,因此用户名始终有效。

解决方案

1. 配置认证与自定义授权策略

在Program.cs中配置Windows认证,并创建针对指定域用户的授权策略:

var builder = WebApplication.CreateBuilder(args);

// 注册Windows认证
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();

// 自定义授权策略:仅允许指定域用户访问
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AllowedDomainUsers", policy =>
    {
        // 强制使用Windows认证方案
        policy.AddAuthenticationSchemes(NegotiateDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        // 校验用户名是否在允许列表中(替换为你的目标用户)
        policy.RequireAssertion(context =>
        {
            var allowedUsers = new List<string> { "YOUR_DOMAIN\\UserA", "YOUR_DOMAIN\\UserB" };
            return allowedUsers.Contains(context.User.Identity?.Name);
        });
    });
});

// 注册Blazor InteractiveServer服务
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();

// 启用认证、授权中间件
app.UseAuthentication();
app.UseAuthorization();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.Run();

2. 为目标组件应用授权策略

直接在受限组件上标记授权策略,无需手动在生命周期中校验用户名:

@attribute [Authorize(Policy = "AllowedDomainUsers")]
@inject AuthenticationStateProvider AuthStateProvider

<h2>仅指定域用户可见的组件</h2>

@code {
    private string? userName;

    protected override async Task OnInitializedAsync()
    {
        // 如需展示用户名,通过AuthenticationStateProvider获取(全阶段有效)
        var authState = await AuthStateProvider.GetAuthenticationStateAsync();
        userName = authState.User.Identity?.Name;
    }
}

3. 确保其余内容允许匿名访问

  • 未标记[Authorize]的组件默认允许匿名访问。
  • 若存在全局授权策略,需在允许匿名的组件上添加[AllowAnonymous]属性。

4. IIS配置要点

  • 同时开启Windows认证和匿名认证(满足部分内容匿名、部分受限的需求)。
  • 无需再配置web.config的<location>节点,Blazor路由由框架处理,代码层面的授权策略更可靠。

关键说明

HttpContextAccessor仅在初始HTTP请求阶段有效,无法覆盖SignalR连接后的渲染场景。AuthenticationStateProvider是Blazor官方推荐的身份获取方式,能在所有渲染阶段正确返回用户认证状态,避免双渲染阶段的身份丢失问题。

内容的提问来源于stack exchange,提问作者osswmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:58:16