【发布时间】: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