题
我在IIS 7中有一个WCF服务在默认应用程序池中以集成模式托管,并启用了匿名访问和Windows身份验证。
我已经将以下属性放在我的接口的方法实现上。
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
如果我在致电我的服务中不提供网络凭据,我会得到预期的行为,因为以下情况是正确的:
ServicesEcurityContext.Current.WindowsIdentity.name = mydomain myuser
ServicesEcurityContext.Current.PrimaryIdentity.name = mydomain myuser
thread.currentprincipal.Identity.name = mydomain myuser
我可以使用SSPI和MyDomain Myuser身份验证连接到远程系统上的数据库。
WindowsIdentity.getCurrent()。名称= mydomain myuser
我可以使用thread.currentprincipal.isinrole()来验证用户处于角色。
我可以使用WindowsIdentity.getCurrent()。组检索用户的组列表。
但是,如果我使用以下内容提供网络凭据:
var networkCredential = new NetworkCredential(user, pwd, dom);
base.ClientCredentials.Windows.ClientCredential = networkCredential;
base.ClientCredentials.Windows.AllowNtlm = true;
base.ClientCredentials.Windows.AllowedImpersonationLevel
= System.Security.Principal.TokenImpersonationLevel.Delegation;
然后,以上所有内容都是相同的,除了数据库连接和列出的两个组不同。使用NT Authority Anonymous Login用户建立了与数据库的连接。使用网络限制性将用户放在NT Authority Network组中,而不是NT Authority Interactive,并删除了本地组。
我的目标是使用NetworkCredential通过的凭据建立与数据库的连接,任何建议都将不胜感激。
Shane持有者
解决方案
听起来像是典型的双跳问题。
我猜想在您的工作场景中,默认情况下正在使用Kerberos,这将为您提供远程服务器上的委托令牌。
在第二种情况下,由于提供的用户/通过,因此不使用Kerberos,并且不支持获得委托令牌。
我知道的远程服务器上获得委托令牌的唯一方法是使用基本身份验证(带有SSL),这是一个完全的痛苦。