【问题标题】:How to delegate Windows Authentication session when running an app on IIS 8?在 IIS 8 上运行应用程序时如何委派 Windows 身份验证会话?
【发布时间】:2018-04-16 11:12:57
【问题描述】:

我有一个在 ASP.Net MVC 5 Framework 之上用 c# 编写的 Intranet 应用程序。我的应用程序配置为通过“Windows 身份验证”方法对用户进行身份验证。此应用程序在 IIS 8 上运行。

我的应用使用第三方 SDK 与我在同一域上运行的另一个程序进行交互。此第三方应用程序允许用户也通过提供的 SDK 使用 Windows 身份验证登录。

问题

但是 SDK 与之通信的服务器总是返回“Invalid user name/password is invalid”。

经过深入故障排除后,我发现 IIS 没有返回正确的用户名。它不是返回“经过身份验证的用户”,而是返回正在运行池应用程序的用户。所以,为了解决这个问题,我将应用设置更改为以下

  • 我禁用了“匿名身份验证”
  • 我启用了“Windows 身份验证”
  • 我启用了“ASP.NET Impersonation”,而“ASP.NET Impersonation”设置设置为“Authenticated user”。笔记: 这需要“经典”托管管道而不是“集成” 某种原因。
  • 我将 AppPool 托管管道设置更改为“经典”v4
  • 将运行 AppPool 的用户更改为“网络服务”而不是“ApplicationPoolId”
  • 然后将身份验证提供程序列表保留为“协商”和“NTLM”
  • 最后,我保持启用“内核模式身份验证”。

所以上述设置返回了正确的用户名,但 不是 将密码委托给 SDK。我猜是因为通讯工具,IIS 正在保护登录的用户,它不允许允许我将密码委托给另一个服务/SDK。

然后我尝试将我的设置更改为以下

  • 我将 AppPool 托管管道设置更改为“Integrated”v4.0
  • 将运行 AppPool 的用户更改为“网络服务”
  • 我禁用了“匿名身份验证”
  • 我启用了“Windows 身份验证”
  • 禁用“ASP.NET 模拟”
  • 身份验证提供程序列出“Negotiate:Kerberos”、“Negotiate”和“NTLM”
  • 我禁用了“内核模式身份验证”,因为它不适用于“Kerberos”提供程序。

所以上面的内容阻止了我完全登录到我的 MVC 应用程序,它只是一遍又一遍地提示我输入我的凭据。

为了解决这个问题,我在域控制器中找到了我的网络服务器名称,然后我转到“委托”选项卡并将其更改为“信任此用户以委托给任何服务(仅限 Kerberos)”

没有这个设置,允许我登录到我的 MVC 应用程序。但这一次,它没有将用户名或密码委托给 SDK。事实上,我得到的用户名是 PoolApp 用户名,而不是经过身份验证的用户。

为了涵盖我的所有基础,我将 AppPool 用户更改为具有 Windows 身份验证访问权限的实际用户,该用户可以访问 SDK 连接到的服务器。果然,效果很好,我能够连接到第二个服务。但是,它始终将运行 AppPool 的用户名/密码委托给 SDK,而不是委托已连接/经过身份验证的用户名/密码。

总之,IIS 出于某种原因没有将用户名/密码委托给 SDK。如何让 IIS 将连接的用户会话/凭据委托给另一个服务?

委派也可能失败,因为用户使用的是“NTLM”身份验证而不是 Kerberos,但服务器只会在仅 Kerberos 身份验证时进行委派”如果是这种情况,我该如何强制用户使用“Kerberos”身份验证而不是“NTLM”?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-5 windows-authentication


    【解决方案1】:

    您是否尝试在您的web.config 中启用impersonation

    <configuration>
        <system.web>
            <identity impersonate="true" />
        </system.web>
    </configuration>
    

    如果这不起作用,您可能需要在 ActiveDirectory 中为此计算机启用委派。见这里:https://stackoverflow.com/a/1405666/5069465

    【讨论】:

    • 我怀疑正确的解决方法是两者兼而有之 - 我们有一个 Web 应用程序使用最终用户凭据对另一个机器上的 SQL 数据库进行身份验证,您需要模拟和委托。
    【解决方案2】:

    要设置特定身份验证提供程序的优先级,您可以在身份验证提供程序列表中上移或下移一项。在 IIS 管理器中打开 Web 应用程序的 Authentication 功能并选择 Windows Authentication 项。在操作面板上点击Providers...操作。提供者列表将被打开,您可以添加特定的提供者并向上移动一个。

    但我不保证它会帮助你。您可以使用内置 IUSR 或应用程序池身份或特殊用户帐户运行第三方程序(有关详细信息,请参阅Kev post)。对调用这些程序的 MVC 控制器使用授权过滤器来限制访问。

    @fboers 帖子向我建议了以下想法:您可以尝试使用 Impersonation Authentication 来解决您的问题。打开 Authentication 功能并启用使用 ASP.NET Impersonation authentication,然后在 Actions 窗格中单击 Edit 并选择经过身份验证的用户选项。在这种情况下,IIS 服务器应该在指定的安全上下文下运行应用程序。

    【讨论】:

    • 是的,我有 Negotiate:Kerberos 作为我的第一选择。我的 Active Directory 中的用户帐户是否需要进行特殊设置才能使用 Kerberos 身份验证?
    • @MikeA,尝试在Server Fault 上询问有关广告的问题。 Windows 身份验证是否适用于您的 Web 应用程序?
    • 我会这样做的。是的 Windows 身份验证工作正常。我还在来自同一 AD 服务器的不同应用程序上使用 LDAP 身份验证。在这方面似乎一切正常
    【解决方案3】:
    • 打开您的 Visual Studio
    • 右键单击您的 Web 项目 -> 属性
    • 检查以下设置

    • 尝试启用它并重新部署,看看会发生什么

    更新

    在您的网络项目中尝试此代码

    var impersonation = ((System.Security.Principal.WindowsIdentity)this.HttpContext.User.Identity).Impersonate();
    
    // ...
    // Call to SDK                
    // ...
    
    impersonation.Undo();
    

    似乎 SDK 使用 System.Security.Principal.WindowsIdentity.GetCurrent(),此方法返回运行应用程序池的进程的标识。 impersonate() 会将其替换为模拟身份并将其传递给线程的后续代码,直到调用 Undo()。

    注意:我在 MVC 控制器中尝试了这段代码,这是“this.HttpContext”的原因

    【讨论】:

    • 在答案中查看我的更新
    • 我认为你错过了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2014-02-05
    • 2011-10-18
    • 2012-07-21
    • 2021-12-28
    相关资源
    最近更新 更多