部署至本地IIS 10(Windows Server 2019)后,集成Microsoft Identity认证(Azure AD)的Blazor Server应用陷入认证循环问题
我之前碰到过和你几乎一模一样的Blazor Server + Azure AD认证部署问题——本地测试完全正常,一放到IIS就卡认证流程,要么报请求头过长的错误,要么直接登不上。给你几个实际验证有效的排查方向:
调整IIS请求头大小限制
你遇到的Bad Request - Request Too Long,本质是认证过程中生成的Correlation和Nonce Cookie堆积,导致请求头超出了IIS默认限制。解决步骤:- 打开IIS管理器,选中你的目标站点
- 打开配置编辑器,在“节”下拉框选择
system.webServer/security/requestFiltering - 找到
requestLimits节点,修改headerSizeLimit为65536(64KB,可根据实际情况再调大) - 再切换到
system.webServer/serverRuntime节,修改maxRequestHeaderSize为同样数值 - 保存配置后重启站点
优化认证Cookie配置
默认的认证Cookie设置在IIS环境下可能导致临时Cookie清理不及时、堆积过多。可以在Program.cs里调整Cookie和OpenID Connect的配置:// 配置Azure AD认证 builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches(); // 自定义Cookie设置,避免临时Cookie堆积 builder.Services.Configure<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.Cookie.Name = ".YourAppAuthCookie"; // 自定义Cookie名称,避免冲突 options.Cookie.SameSite = SameSiteMode.Lax; options.Cookie.MaxAge = TimeSpan.FromHours(1); options.SlidingExpiration = true; options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境建议强制HTTPS });同时要确保Azure AD应用注册里的重定向URI完全匹配部署后的站点地址(比如
https://your-domain.com/signin-oidc),本地测试和生产环境的URI要分开注册,不能混用。确认IIS WebSockets协议已正确启用
虽然你提到已经安装了WebSockets组件,但要确认站点级别的WebSockets是开启的:- 在IIS管理器的站点“功能视图”里找到WebSockets协议
- 确保它处于启用状态(如果没启用,右键点击选择“启用”)
Blazor Server依赖WebSockets维持连接,认证流程中如果WebSocket不通,可能导致跳转异常和Cookie堆积。
更新ASP.NET Core托管运行时
旧版本的.NET 6.0托管运行时在IIS环境下可能存在认证相关的Bug,建议去微软官网下载最新的.NET 6.0托管运行时重新安装,安装完成后重启服务器再测试。启用详细日志排查
如果上面的方法都没解决,开启详细的认证日志来定位具体问题:
在appsettings.json里添加日志配置:{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.Identity.Web": "Debug", "Microsoft.AspNetCore.Server.IISIntegration": "Debug" } } }然后查看IIS站点的日志文件(默认在
C:\inetpub\logs\LogFiles),或者用日志框架把日志输出到文件,这样能看到认证流程中每一步的错误细节,比如重定向URI不匹配、Token获取失败等。
我当时是通过调整IIS请求头大小和优化Cookie配置解决了问题,你可以按顺序试试这些方法,应该能搞定。
内容的提问来源于stack exchange,提问作者Nich Overend

