如何在IIS 8上运行应用程序时委派Windows身份validation会话?

我在ASP.Net MVC 5 Framework的顶部用c#编写了一个内部网应用程序。 我的应用程序配置为通过“Windows身份validation”方法对用户进行身份validation。 此应用程序在IIS 8上运行。

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

问题

但是SDK与之通信的服务器始终返回“无效的用户名/密码无效”。

经过深入的故障排除后,我发现IIS没有返回正确的用户名。 它不是返回“Authenticated User”,而是返回正在运行pool app的用户。 因此,要解决此问题,我将应用设置更改为以下内容

  • 我禁用了“匿名身份validation”
  • 我启用了“Windows身份validation”
  • 我启用了“ASP.NET模拟”,而“ASP.NET模拟”设置被设置为“经过身份validation的用户”。 注意:由于某种原因,这需要“经典”托管管道而不是“集成”。
  • 我将AppPool管理的管道设置更改为“Classic”v4
  • 将运行AppPool的用户更改为“网络服务”而不是“ApplicationPoolId”
  • 然后将身份validation提供程序列表保留为“Negotiate”和“NTLM”
  • 最后,我保持启用“Kernal模式身份validation”。

所以上面的设置返回了正确的用户名,但是它没有将密码委托给SDK。 我想因为通信滚刀,IIS正在保护登录用户,并且它不允许我将密码委托给另一个服务/ SDK。

那么我尝试将我的设置更改为以下内容

  • 我将AppPool管理的管道设置更改为“Integrated”v4.0
  • 将运行AppPool的用户更改为“网络服务”
  • 我禁用了“匿名身份validation”
  • 我启用了“Windows身份validation”
  • 禁用了 “ASP.NET模拟”
  • 身份validation提供程序列表“协商:Kerberos”,“协商”和“NTLM”
  • 我禁用了“Kernal模式身份validation”,因为它不能与“Kerberos”提供程序一起使用。

所以上面阻止我完全登录我的MVC应用程序,它只是不断地提示我一遍又一遍地提取我的凭证。

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

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

为了涵盖我的所有基础,我将AppPool用户更改为对SDK所连接的服务器具有Windows身份validation访问权限的实际用户。 果然工作得很好,我能够连接到第二个服务。 但是, 始终将运行AppPool的用户名/密码委派给SDK,而不是委派连接/validation的用户名/密码。

总之,IIS不会出于某种原因将用户名/密码委托给SDK。 如何让IIS将连接的用户会话/凭证委派给其他服务?

由于用户正在使用“NTLM”身份validation而不是Kerberos,因此委派也可能失败,但服务器将仅在Kerberos身份validation时委派“如果是这种情况,我该如何强制用户使用”Kerberos “身份validation而不是”NTLM?

您是否尝试在web.config启用模拟 ?

      

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

要设置特定身份validation提供程序的优先级,您可以在身份validation提供程序列表中上下移动一个。 在IIS管理器中打开Web应用程序的身份validationfunction,然后选择Windows身份validation项。 在“操作”窗格上,单击“ 提供者…”操作。 将打开提供商列表,您可以添加特定提供商并将其中一个提升。

认证提供者

但我并不认为它会对你有所帮助。 您可以使用内置IUSR或应用程序池标识或特殊用户帐户运行第三方程序(有关详细信息,请参阅Kev文章 )。 对MVC控制器使用授权filter,调用这些程序来限制访问。

@fboerspost向我提出了以下想法:您可以尝试使用模拟身份validation来解决您的问题。 打开身份validationfunction并启用ASP.NET 模拟身份validation ,然后单击“ 操作”窗格中的“ 编辑” ,并选择“ 身份validation用户”选项。 在这种情况下,IIS服务器应在指定的安全上下文下运行应用程序

  • 打开Visual Studio
  • 右键单击您的Web项目 – >属性
  • 检查以下设置 在此处输入图像描述

  • 尝试启用它并重新部署以查看将发生的情况

更新

在您的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”的原因