我有一个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已经是最终版,不能再修改了。
非常感谢任何帮助。
由于
答案 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
有关详细信息,请参阅here
答案 1 :(得分:0)
NTLM在具有本地安全上下文的计算机中工作。如果要在不同的计算机上使用NTLM,这些计算机应共享相同的安全上下文,如Active Directory域。如果您的站点(机器所在的位置)没有相同的安全上下文,则无法使用。您可以通过更改服务的配置来使用客户端证书。不改变dll或代码。