我在IIS 6.0下的Windows Server 2003中运行基于WSE 3.0的Web服务。我希望Web服务进程模拟发送Web服务请求的客户端用户,但该服务不会冒充客户端。
Web应用程序有自己的应用程序池,当前设置为在网络服务标识下运行。 Windows Server 2003计算机帐户已在Active Directory中启用委派(至少根据我的IT人员)。服务WSE策略(在wse3policyCache.config中)如下所示:
<policy name="GeneratedServicesPolicy">
<kerberosSecurity establishSecurityContext="false" renewExpiredSecurityContext="true" requireSignatureConfirmation="false" messageProtectionOrder="SignBeforeEncrypt" requireDerivedKeys="true" ttlInSeconds="300">
<protection>
<request signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
<response signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
<fault signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
</protection>
</kerberosSecurity>
<requireActionHeader />
</policy>
该服务在其web.config中包含以下条目(其中包括):
<identity impersonate="false"/>
<authentication mode="Windows"/>
为应用程序启用了匿名访问(这是必需的,因为服务不使用传输级安全性,因此消息级别是)。机器帐户已注册以下SPN:
HOST/RD360-2
HOST/rd360-2.mycompany.com
客户端在其wse3policyCache.config中具有以下内容:
<policy name="KerbClient">
<kerberosSecurity establishSecurityContext="false" renewExpiredSecurityContext="true" requireSignatureConfirmation="false" messageProtectionOrder="SignBeforeEncrypt" requireDerivedKeys="true" ttlInSeconds="300">
<token>
<kerberos targetPrincipal="HOST/rd360-2.mycompany.com" impersonationLevel="Impersonation" />
</token>
<protection>
<request signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
<response signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
<fault signatureOptions="IncludeAddressing, IncludeTimestamp, IncludeSoapBody" encryptBody="false" />
</protection>
</kerberosSecurity>
<requireActionHeader />
</policy>
客户端代码如下所示:
static void Main(string[] args)
{
AddFloatsWSWse client = new AddFloatsWSWse();
client.SetPolicy("KerbClient");
double result = client.AddFloats(2.3, 3.2);
Console.WriteLine("Result was: '" + result + "'");
}
但该服务并非冒充我的客户身份。我在服务中使用log4net,当我要求它将%username
打印到ASP.NET跟踪日志中时,它总是NT AUTHORITY\NETWORK SERVICE
而不是客户端用户ID。有什么我做错了吗?有什么地方我可以看看WSE是否甚至试图进行模仿和失败?我确实在事件日志中看到以下条目(MYDOMAIN和MYUSER在这里被遮挡):
Event Type: Success Audit
Event Source: Security
Event Category: Privilege Use
Event ID: 576
Date: 12/9/2009
Time: 11:07:16 AM
User: MYDOMAIN\MYUSER
Computer: RD360-2
Description:
Special privileges assigned to new logon:
User Name: MYUSER
Domain: MYDOMAIN
Logon ID: (0x0,0x4B410AE)
Privileges: SeSecurityPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeTakeOwnershipPrivilege
SeDebugPrivilege
SeSystemEnvironmentPrivilege
SeLoadDriverPrivilege
SeImpersonatePrivilege
----------------------------------------------------------------------------------
Event Type: Success Audit
Event Source: Security
Event Category: Logon/Logoff
Event ID: 540
Date: 12/9/2009
Time: 11:07:16 AM
User: MYDOMAIN\MYUSER
Computer: RD360-2
Description:
Successful Network Logon:
User Name: MYUSER
Domain: MYDOMAIN
Logon ID: (0x0,0x4B410AE)
Logon Type: 3
Logon Process: Kerberos
Authentication Package: Kerberos
Workstation Name:
Logon GUID: {OBFUSCATED}
Caller User Name: -
Caller Domain: -
Caller Logon ID: -
Caller Process ID: -
Transited Services: -
Source Network Address: -
Source Port: -
在我的WSE跟踪文件中,我看到:
<processingStep description="Entering SOAP filter Microsoft.Web.Services3.Design.RequireSoapHeaderAssertion+RequireSoapHeaderFilter" />
<processingStep description="Exited SOAP filter Microsoft.Web.Services3.Design.RequireSoapHeaderAssertion+RequireSoapHeaderFilter" />
<processingStep description="Entering SOAP filter Microsoft.Web.Services3.Design.KerberosAssertion+ServiceInputFilter" />
<processingStep description="Exited SOAP filter Microsoft.Web.Services3.Design.KerberosAssertion+ServiceInputFilter" />
所以至少我知道Kerberos扩展正在处理我的Kerberos头。
编辑:我的网络服务然后使用专有客户端通信库使用SSPI / IWA调用另一台服务器(让我们将第三台服务器称为foo服务器)。我希望它在第二次调用foo服务器时使用客户端的身份。这意味着此客户端通信库使用foo服务器的SPN和其他服务调用AcquireCredentialsHandle
和InitializeSecurityContext
。在这种特殊情况下,foo服务器实际上在与WSE Web服务相同的机器上运行(因此它使用SPN mycompany/rd260-2
)。由于第二跳是同一台机器,我希望这可以使用NTLM,但它仍然应该冒充我的Web服务客户端的用户身份,不应该吗?在foo服务器的日志中,我看到它接受连接,使用提供的IWA安全上下文并告诉我,基于此安全上下文,连接用户是rd36-2$
,这是自WSE Web以来的计算机帐户服务正在IIS中的网络服务标识下运行(该服务标识又与计算机帐户关联)。在foo服务器的日志中,在收到IWA安全上下文后,我最终希望看到提交Web服务请求的用户的身份。将foo服务器移动到另一台机器是否有用,看看它是否与此有关?
答案 0 :(得分:2)
与WSE 3一起使用的Kerberos令牌是一种消息级安全机制,仅对客户端进行身份验证。它实际上并不像IWA中那样更改安全上下文,因此您不会在跟踪日志中发现任何不同的内容。为了实际冒充客户,你必须:
impersonationLevel="Impersonation"
元素(您已经完成)上使用<kerberos>
启用对安全令牌的模拟;和WindowsImpersonationContext
。示例:
WindowsIdentity identity =
(WindowsIdentity)RequestSoapContext.Current.IdentityToken.Identity;
WindowsImpersonationContext impersonationContext = null;
try
{
impersonationContext = identity.Impersonate();
// Perform your work here
// ...
}
finally
{
if (impersonationContext != null)
{
impersonationContext.Undo();
}
}
答案 1 :(得分:0)
到目前为止,我可以理解的情况是,当您尝试进行第二跳时,Kerberos票证将被删除。在双跃点场景中,Kerberos票证将在第二跳被删除。
此后您的身份验证将失败,并且不会切换到NTLM。