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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:21:00