启用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
相关产品推荐
相关产品推荐

