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