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

IIS部署ASP.NET Core应用:AD自动登录异常求助

解决ASP.NET Core在IIS上AD自动登录的Chrome凭据弹窗问题

一、Chrome浏览器配置补全

Chrome需同时配置两个参数才能正常完成Negotiate自动认证,仅设置AuthNegotiateDelegateWhitelist不足以解决问题:

  • 打开Chrome的chrome://flags/页面
  • 搜索并设置以下两个参数为你的应用域名(如*.yourdomain.com或完整FQDN):
    • AuthNegotiateDelegateWhitelist
    • AuthServerWhitelist
  • 重启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配置优化

  1. 调整Windows身份认证提供程序顺序:
    • 在IIS站点的「身份认证」设置中,打开「Windows身份认证」的「提供程序」选项
    • 将Negotiate移至NTLM上方,确保优先使用Kerberos认证
  2. 应用池身份配置:
    • 将应用池身份设置为域账户或Network Service(域内环境下Network Service拥有AD访问权限),避免使用LocalSystem导致权限不足
  3. 匿名认证范围控制:
    • 若仅部分页面允许匿名访问,在IIS中针对需要AD认证的路径禁用匿名认证;或在代码中通过[Authorize]特性标记需要认证的控制器/方法

四、Chrome Kerberos缓存排查

  • 打开命令提示符,执行klist purge清除本地Kerberos票据缓存
  • 重启Chrome,重新登录域账号后测试自动认证流程

内容的提问来源于stack exchange,提问作者Lilian Boissard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:24:52