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

启用Windows身份验证的Blazor Server应用控制器401未授权问题

解决Blazor Server Windows身份验证下控制器401未授权问题

1. 检查IIS Express身份验证配置

  • 右键项目→属性→切换到「调试」标签
  • 同时勾选「启用Windows身份验证」和「启用匿名身份验证」(仅启用Windows身份验证时,IIS层会优先拦截匿名请求,导致[AllowAnonymous]特性失效)
  • 保存配置后重启IIS Express

2. 修正Program.cs中间件配置

确保身份验证中间件顺序正确,且授权策略配置合理:

var builder = WebApplication.CreateBuilder(args);

// 注册Windows身份验证服务
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    // 默认策略要求身份验证,对不需要验证的控制器单独标记[AllowAnonymous]
    options.FallbackPolicy = options.DefaultPolicy;
});

// 注册控制器、Blazor相关服务
builder.Services.AddControllersWithViews();
builder.Services.AddServerSideBlazor();

var app = builder.Build();

// 中间件顺序必须是先认证、再授权
app.UseAuthentication();
app.UseAuthorization();

// 映射控制器路由
app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

3. 确认控制器的[AllowAnonymous]标记

确保控制器类或目标Action上正确添加特性:

[ApiController]
[Route("api/[controller]")]
[AllowAnonymous] // 全局允许匿名,或仅给特定Action添加
public class UpdateTestController : ControllerBase
{
    [HttpGet]
    public int Get()
    {
        return 123;
    }
}

4. 调整客户端请求配置

匿名访问场景

如果控制器允许匿名,客户端不要附带Windows凭据:

public async Task<int> GetUpdateTestTimerResult()
{
    var handler = new HttpClientHandler
    {
        UseDefaultCredentials = false // 禁用默认凭据,发送纯匿名请求
    };

    using var client = new HttpClient(handler);
    client.BaseAddress = new Uri("http://localhost:40871");
    
    var response = await client.GetAsync("api/updateTest");
    response.EnsureSuccessStatusCode(); // 抛出异常便于排查状态码
    
    var value = await JsonSerializer.DeserializeAsync<int>(
        await response.Content.ReadAsStreamAsync(),
        new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
    );
    return value;
}

Windows身份验证访问场景

如果需要客户端用Windows身份验证访问,确保运行客户端的账户有权限:

public async Task<int> GetUpdateTestTimerResult()
{
    var handler = new HttpClientHandler
    {
        UseDefaultCredentials = true // 使用当前Windows账户凭据
    };

    using var client = new HttpClient(handler);
    client.BaseAddress = new Uri("http://localhost:40871");
    
    var response = await client.GetAsync("api/updateTest");
    response.EnsureSuccessStatusCode();
    
    var value = await JsonSerializer.DeserializeAsync<int>(
        await response.Content.ReadAsStreamAsync(),
        new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
    );
    return value;
}

5. 检查IIS Express配置文件

找到项目根目录下的.vs/config/applicationhost.config,确保站点的身份验证配置正确:

<authentication>
  <anonymousAuthentication enabled="true" userName="" />
  <windowsAuthentication enabled="true">
    <providers>
      <add value="Negotiate" />
      <add value="NTLM" />
    </providers>
  </windowsAuthentication>
</authentication>

修改后重启IIS Express生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:22:37