将Windows安全令牌传递给使用NTLM和Windows身份验证调用另一个Web服务的对象

时间:2014-08-14 23:28:04

标签: wcf iis windows-authentication

我有一个Web应用程序,它调用一个调用wcf服务的引用dll / api的对象。

Machine 1 = where the wcf service resides
Machine 2 = IIS server, the web application that uses the api that calls the service from Machine 1

我的代码:

using (WindowsAuthenticationContext ctx = identity.Impersonate()){
  //Call to the API goes here
}

当我从Machine 2(IIS服务器)访问网站时,它可以工作。但是,当我从另一台客户端计算机访问该网站时,它给出了一个错误“请求令牌无法满足”。

注意:api已经是最终版,不能再修改了。

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:2)

你不能在多跳(服务器)上执行NTLM和Kerberos。您需要使用Kerberos在所有跃点上委派Windows身份验证。

您需要配置SPNS以使kerberos能够跨机器委派身份验证。

要配置这些命令,您必须发出以下命令 - 假设您有权修改AD:

SETSPN -S HTTP/Machine1 ADDomain\AppPoolCredential1
SETSPN -S HTTP/Machine1.domainname.com ADDomain\AppPoolCredential1

SETSPN -S HTTP/Machine2 ADDomain\AppPoolCredential2
SETSPN -S HTTP/Machine2.domainname.com ADDomain\AppPoolCredential2

其中ADDomain \ AppPoolCredential是应用程序池的凭据 - 请注意,您无法使用网络服务作为应用程序池凭据来使Kerberos委派工作。您需要使用域帐户。

在AD中,您需要启用以下对象以允许Kerberos委派:

ADDomain\AppPoolCredential1
ADDomain\AppPoolCredential2
Machine1
Machine2 

Trust object for delegation in AD

有关详细信息,请参阅here

答案 1 :(得分:0)

NTLM在具有本地安全上下文的计算机中工作。如果要在不同的计算机上使用NTLM,这些计算机应共享相同的安全上下文,如Active Directory域。如果您的站点(机器所在的位置)没有相同的安全上下文,则无法使用。您可以通过更改服务的配置来使用客户端证书。不改变dll或代码。