我在集成模式下的默认应用程序池中的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()。Name = myDomain \ myUser
我可以使用Thread.CurrentPrincipal.IsInRole()来验证用户是否在角色中
我可以使用WindowsIdentity.GetCurrent()。Groups来检索用户的组列表。
但是,如果我使用以下内容提供网络凭据:
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登录用户建立与数据库的连接。使用NetworkCredentials将用户置于NT Authority \ Network组而不是NT Authority \ Interactive中,此外还删除了LOCAL组。
我的目标是使用NetworkCredential传递的凭据建立与数据库的连接,我们将不胜感激。
Shane Holder
答案 0 :(得分:0)
听起来像典型的双跳问题。
我猜你的工作场景默认情况下Kerberos会被使用,这会在远程服务器上获得一个委托令牌。
在第二种情况下,它不使用Kerberos,因为提供的用户/传递并且不支持获取委托令牌。
在我所知道的远程服务器上获取委托令牌的唯一其他方法是使用基本身份验证(使用SSL),这是一个彻头彻尾的痛苦。