.Net Core 3.1 IIS部署Windows认证后用户无Claims问题求解
排查步骤
- 首先检查站点根目录下的
web.config配置,确保aspNetCore节点已添加forwardWindowsAuthToken="true"属性,示例配置如下:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath=".\你的程序名.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" hostingModel="inprocess" /> </system.webServer>
本地IIS开发时通常会自动生成该配置,手动部署到远端服务器时容易遗漏该参数,导致IIS不会把Windows身份认证的令牌转发给.NET Core应用。
- 验证远端IIS站点的Windows身份认证提供程序优先级:打开IIS站点的「身份认证」功能,右键点击Windows身份认证选择「提供程序」,确认
NTLM在Negotiate上方。部分域环境下Kerberos配置缺失时,Negotiate协议会导致令牌传递异常,调整优先级后重启站点测试。 - 确认应用程序池配置:应用池托管管道模式必须为集成模式,同时检查应用池运行身份是否拥有域用户信息读取权限。如果应用池使用本地系统、本地服务等无域权限的账号,会导致.NET Core无法解析传入的Windows身份令牌生成Claims。
- 补充认证服务配置,你的现有代码缺少Negotiate协议的显式注册,修改
ConfigureServices方法中的认证注册代码:
services.AddAuthentication(IISDefaults.AuthenticationScheme) .AddNegotiate();
- 可添加临时测试中间件定位问题,在
app.UseRouting()之后、app.UseAuthentication()之前添加如下代码,查看服务器侧是否能收到IIS传递的身份信息:
app.Use(async (context, next) => { // 打印IIS传递的原始身份信息 var logonUser = context.Request.ServerVariables["LOGON_USER"]; var isAuthenticated = context.User.Identity?.IsAuthenticated ?? false; // 输出到日志或者响应头排查 context.Response.Headers["X-Logon-User"] = logonUser ?? "empty"; context.Response.Headers["X-Authenticated"] = isAuthenticated.ToString(); await next.Invoke(); });
如果测试发现LOGON_USER有值但User.Identity未认证,说明认证中间件加载异常,可尝试重新安装对应版本的.NET Core 3.1托管捆绑包。
内容的提问来源于stack exchange,提问作者mjhixson
相关产品推荐
相关产品推荐

