我有一个可以使用WebHttpBinding
访问的自托管WCF服务。这个服务应该从客户端的internet explorer获得一个kerberos令牌,然后他应该用这个令牌进行模拟,通过另一个服务器上的网络共享访问文件服务器。
像这样的链:
IE (Client) -> WCF-Service (BI-Server) -> impersonate -> access network share on file server
但是IE显示一个登录对话框,如果我改变ClientCredentialType
或添加一个ServiceAuthenticationBehavior
与Kerberos设置(401未授权)。
使用NTLM,我可以访问WCF服务并进行模拟,但是对文件服务器的访问会导致UnauthorizedAccessException
。
同一台服务器还有一个使用Kerberos的NetTcpBinding
,可以正常工作。
我做错了什么?
在BI服务器上激活Kerberos(所有服务)的委托。
- ads -功能等级为2012
- 文件服务器是Windows server 2003
- WCF/IIS-Host是Windows Server 2012 R2
- 客户端是Windows 8, IE 10
var listenUrl = "http://0.0.0.0:8735";
var bind = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly)
{
Security = {Transport = {ClientCredentialType = HttpClientCredentialType.InheritedFromHost}},
TransferMode = TransferMode.StreamedResponse
};
var host = new WebServiceHost(typeof(C_SIS), new Uri(listenUrl));
host.AddServiceEndpoint(typeof(IW_SIS), bind, "").Behaviors.Add(new WebHttpBehavior());
ServiceAuthenticationBehavior sab = null;
sab = host.Description.Behaviors.Find<ServiceAuthenticationBehavior>();
if (sab == null)
{
sab = new ServiceAuthenticationBehavior();
sab.AuthenticationSchemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm;
host.Description.Behaviors.Add(sab);
}
else
{
sab.AuthenticationSchemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm;
}
host.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(UnbekannterRecv);
host.Open();
首先,检查您的服务是否与域用户一起运行。然后必须为该用户设置SPN(服务主体名称)。
setspn -s httpwcfHostMachineName:PORT DOAMINUser
setspn -s httpwcfHostMachineName.FULLDomain.Quantifier:PORT DOAMINUser
使用
清除客户机上所有的kerbero - tokenklist -purge
试试。如果它工作->很好。但是,如果没有打开您的ADS-User-Configuration并从wcfHost中删除所有没有端口的http-SPN,而不是用户!wcfHost不需要单独的SPN。