通过 IIS、ASP.NET 5 和 Microsoft SQL 服务器自动进行 Windows 身份验证

Automatic Windows Authentication over IIS, ASP.NET 5 and Microsoft SQL Server

相关信息很多,希望不要忘记。我们希望自动 Windows 登录到我们域中的 Intranet 网站。 为了在客户端上进行测试,我使用了将网站列入白名单的 chrome 浏览器。 服务器运行 IIS 版本 10.0.19041 运行 一个 ASP.NET 5 网站。它连接到同一域中的数据库 MS SQL 服务器。 连接字符串具有参数 Integrated Security=SSPI 并在客户端本地与 Apps 运行 一起使用。

这是目前正在发生的事情:通常该网站会要求提供凭据,但由于它在白名单中,我假设它现在使用 Windows 凭据,此处如何解释

    using (SqlConnection Verbindung = new SqlConnection(sqlConnectString))
    {
        Verbindung.Open();

抛出“用户登录失败”错误,因为它尝试连接活动的网络服务器用户,而不是自动登录的客户端。 System.Security.Principal.WindowsIdentity.GetCurrent().Name returns AppPool 中的账户标识。

我们所做的:(可能并不都是相关的...)

过去几天我们在谷歌上搜索了很多,以了解该怎么做。一般关键字好像是Windows Authentication,可能是impersonation,NTLM。 所以我们将身份验证添加到 ConfigureServices。现在看起来像这样:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews()
                .AddXmlSerializerFormatters()
                .AddXmlDataContractSerializerFormatters();

            services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.Ntlm);

            services.AddSession();
            services.AddAuthorization(options =>
            {
                options.AddPolicy("AuthorizationMode", (policy) =>
                {
                    //unauthenticated
                    policy.RequireAssertion((e) => true);
                });
            });
            //services.AddMvc();
            services.AddHttpContextAccessor();
        }

我们也在 IISDefaults.AuthenticationScheme 和未授权的情况下进行了尝试。

配置函数片段:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            SessionOptions s = new SessionOptions();
            s.IdleTimeout = System.TimeSpan.FromMinutes(30);
            s.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Lax;
            s.Cookie.Name = ".acclaro.de.Session";
            s.Cookie.IsEssential = true;

            app.UseSession(s);
            
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();
(...)

在 IIS/Sites/[Website]/Authentication 中,我们禁用了匿名身份验证并启用了 Windows 身份验证。这意味着,我想,我不必编辑 web.config.

我们在启用和禁用模拟的情况下都进行了尝试。基本身份验证似乎总是要求提供用户名和密码。所以这不是我们想要的。

我们了解到我必须更改提供商的顺序。将 Negotiate 置于 NTLM 下,或彻底删除它都不会改变任何内容。

我还了解到我必须添加 SPN。所以我在我们的域控制器上执行了 setspn -a http/[url] [domain controller computer name]

我不知道我错过了什么。也许我还没有尝试过正确的组合。如果有人可以提供帮助,将不胜感激。 (我也希望当我在服务器上的本地临时文件夹中写入时,冒充其他用户不会产生问题。我过去曾遇到过一些访问被拒绝的异常。)

如果缺少一些相关信息,请告诉我。

Windows 身份验证意味着模拟,这是一种常见的误解。当用户使用 Windows 集成身份验证向服务器进行身份验证时,服务器上的代码不会自动启动 运行 作为该用户

企业 Web 应用程序的正常配置是让 IIS 对用户 Windows Auth 进行用户身份验证,但使用 IIS 应用程序池标识连接到 SQL 服务器。

如果您希望用户通过 Web 应用程序以他们自己的身份连接到 SQL 服务器,这称为“模拟”,您需要启用和配置它。有一个 SO 问题 here 展示了如何在中间件中执行模拟。但是可能需要额外的配置,例如 Kerberos Constrained Delegation 配置。

这样做的缺点是

  1. 配置是额外的工作,您可能需要网络管理员的帮助。

  2. 如果用户可以通过应用程序直接连接到数据库,他们也可以通过其他工具进行连接。所以安全管理更难,风险更大。

  3. 用户不能重复使用连接,所以你会有很多空闲连接。