WCF:NetworkCredential 和 Impersonation 之间的关系

Posted

技术标签:

【中文标题】WCF:NetworkCredential 和 Impersonation 之间的关系【英文标题】:WCF:Relationship between NetworkCredential and Impersonation 【发布时间】:2009-03-26 16:59:09 【问题描述】:

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

肖恩·霍尔德

【问题讨论】:

【参考方案1】:

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

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

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

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

Concerning the credentials double hop issue

【讨论】:

我添加了审查 WindowsIdentity.GetCurrent().AuthenticationType 并且在这两种情况下都是 Kerberos。此外,在发送凭据时,我将 AllowedImpersonationLevel 设置为委托,期望我能够委托。 将 Thread.CurrentPrincipal.Identity 转换为 WindowsIdentity 并检查服务器上的 ImpersonationLevel ImpersonationLevel 在这两种情况下都是模拟。 如果两者都只是模拟令牌,那么即使第一种情况也无法将凭据从中间服务器传递到数据库服务器。 我通常会同意,但如果它们相同,那么行为应该是相同的,都不应该能够联系服务器。除非我正在查看错误的凭据集,否则有很多地方可以找到 IPrincipal,这很难知道哪个没有用于数据库连接

以上是关于WCF:NetworkCredential 和 Impersonation 之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?

JavaScript运算符:递增和递减(++i,--i 和 i++,i-- 的区别)

关于i++ 和 ++i

.NET基础之:i++和i=i+1和++i的区别

PHP中的++$i和$i++有啥区别?

Inter1-关于i++和++i