2

我在集成模式下的默认应用程序池中托管在 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 传递的凭据建立与数据库的连接,任何建议都将不胜感激。

肖恩持有人

4

1 回答 1

0

听起来像是典型的双跳问题。

我猜在您的工作场景中,默认情况下会使用 Kerberos,这将为您提供远程服务器上的委托令牌。

在第二种情况下,由于提供了用户/通行证,它不使用 Kerberos,并且不支持获取委托令牌。

我知道的在远程服务器上获取委托令牌的唯一其他方法是使用基本身份验证(使用 SSL),这完全是一种痛苦。

关于凭证双跳问题

于 2009-03-26T18:18:13.003 回答