IIS部署ASP.NET Core应用:AD自动登录异常求助
解决ASP.NET Core在IIS上AD自动登录的Chrome凭据弹窗问题
一、Chrome浏览器配置补全
Chrome需同时配置两个参数才能正常完成Negotiate自动认证,仅设置AuthNegotiateDelegateWhitelist不足以解决问题:
- 打开Chrome的
chrome://flags/页面 - 搜索并设置以下两个参数为你的应用域名(如
*.yourdomain.com或完整FQDN):AuthNegotiateDelegateWhitelistAuthServerWhitelist
- 重启Chrome后重新测试
若使用域内机器,确保Chrome以域用户账号启动,而非本地用户账号。
二、修正代码中的认证逻辑
你当前在SessionStart方法中先调用ChallengeAsync再立刻执行AuthenticateAsync的逻辑存在问题——Challenge会触发HTTP跳转,后续的Authenticate无法获取实时认证结果。建议改用中间件统一处理认证流程:
1. 调整Program.cs中间件顺序
在UseSession之后、UseAuthorization之前添加自定义认证检查中间件:
var app = builder.Build(); // ... 其他已有配置(HttpsRedirection、StaticFiles等) app.UseRouting(); app.UseAuthentication(); app.UseSession(); // 添加AD认证检查中间件 app.Use(async (context, next) => { var login = context.Session.GetString("Login"); if (string.IsNullOrEmpty(login)) { var authResult = await context.AuthenticateAsync(NegotiateDefaults.AuthenticationScheme); if (!authResult.Succeeded) { // 触发Negotiate认证流程 await context.ChallengeAsync(NegotiateDefaults.AuthenticationScheme); return; } var currentUsername = authResult.Principal?.Identity?.Name ?? "Anonymous"; if (!string.IsNullOrEmpty(currentUsername)) { var AD = new ActiveDirectory(domainName, domainUsername, domainPassword); if (AD.TestConnection()) { bool isAuthorized = false; // 检查用户所属AD组 if (AD.IsUserInGroup(currentUsername, Session.domaineComplet)) { context.Session.SetString("Login", currentUsername); context.Session.SetString("Group", Session.domaineComplet); context.Session.SetString("isAd", "true"); isAuthorized = true; } else if (AD.IsUserInGroup(currentUsername, Session.domaineBasic)) { context.Session.SetString("Login", currentUsername); context.Session.SetString("Group", Session.domaineBasic); context.Session.SetString("isAd", "true"); isAuthorized = true; } if (!isAuthorized) { // 非授权用户跳转至指定页面 context.Response.Redirect("/Unauthorized"); return; } } else { // AD连接失败时的跳转处理 context.Response.Redirect("/ADConnectionError"); return; } } } await next(); }); app.UseAuthorization(); // ... 已有路由配置
2. 移除业务代码中的手动认证逻辑
删除SessionStart方法内的ChallengeAsync和AuthenticateAsync调用,依赖中间件统一处理认证流程。
三、IIS配置优化
- 调整Windows身份认证提供程序顺序:
- 在IIS站点的「身份认证」设置中,打开「Windows身份认证」的「提供程序」选项
- 将
Negotiate移至NTLM上方,确保优先使用Kerberos认证
- 应用池身份配置:
- 将应用池身份设置为域账户或
Network Service(域内环境下Network Service拥有AD访问权限),避免使用LocalSystem导致权限不足
- 将应用池身份设置为域账户或
- 匿名认证范围控制:
- 若仅部分页面允许匿名访问,在IIS中针对需要AD认证的路径禁用匿名认证;或在代码中通过
[Authorize]特性标记需要认证的控制器/方法
- 若仅部分页面允许匿名访问,在IIS中针对需要AD认证的路径禁用匿名认证;或在代码中通过
四、Chrome Kerberos缓存排查
- 打开命令提示符,执行
klist purge清除本地Kerberos票据缓存 - 重启Chrome,重新登录域账号后测试自动认证流程
内容的提问来源于stack exchange,提问作者Lilian Boissard
相关产品推荐
相关产品推荐

