我使用下面的代码片段来获取WCF服务中的客户端用户名。在我的一台服务器上,我收到了错误的客户端名称。我的客户端是Win7,在工作组配置中与Server 2008R2通信,两台计算机都有用户Dave
和Dave_Admin
。两者都是Win7上的admin,只有后者是服务器上的admin。问题是我以Dave
启动客户端,服务器将客户端显示为Dave_Admin
。我已经在连接的两端调试了身份,如客户端上的Dave和服务器上的Dave_Admin。声明资源还会显示Dave_Admin
SID。
我能想象出现这种情况的唯一两个原因是
Dave_Admin
寻找我怀疑的Dave
,或者Dave
重命名为Dave_Admin
,然后以标准用户身份创建了新用户Dave
。 我只有一个模糊的回忆我可能已经这样做但不确定我是否做过。 c:\users
文件夹看起来很正常。如果我这样做了,这就是原因,无论如何要纠正吗?
如果在用户重命名后发生这种情况,任何人都有另一种可能的解释或方法来修复?
OperationContext lContext = OperationContext.Current;
RemoteEndpointMessageProperty mEndpointMessageProperties = lContext.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
mIdentity = lContext.ServiceSecurityContext.WindowsIdentity;
mUserName = mIdentity.Name;
mIPAddress = mEndpointMessageProperties.Address;
mPort = mEndpointMessageProperties.Port;
mConsoleID = string.Format("IP:{0}Port:{1}", mIPAddress, mPort);
mCallbackInterface = lContext.GetCallbackChannel<IConsoleCallbacks>();
mAuthority = TxWcfServer.sSelf.Authorized(mIdentity); // get the user's authority from the WcfServer when they logged on
// show client information
if (AppSupport.IsLogLevel(LogLevel.WCF))
{
// show the various security contexts
var x = lContext.ServiceSecurityContext;
AppSupport.WriteLog(LogLevel.Note, "*** WCF WindowsIdentity is '{0}'.", x.WindowsIdentity.Name);
AppSupport.WriteLog(LogLevel.Note, "*** WCF PrimaryIdentity is '{0}'.", x.PrimaryIdentity.Name);
AppSupport.WriteLog(LogLevel.Note, "*** WCF IsAnonymous is '{0}'.", x.IsAnonymous);
foreach (ClaimSet claimset in ServiceSecurityContext.Current.AuthorizationContext.ClaimSets)
{
foreach (System.IdentityModel.Claims.Claim claim in claimset)
{
// Write out each claim type, claim value, and the right. There are two
// possible values for the right: "identity" and "possessproperty".
AppSupport.WriteLog(LogLevel.Note, "*** WCF Claim Type: {0}, Resource: {1} Right: {2}",
claim.ClaimType, claim.Resource.ToString(), claim.Right);
}
}
}
答案 0 :(得分:0)
你需要在你的WCF服务上启用模拟,以便你的代码能够获得客户端上下文,否则你将获得服务上下文(这可能是你得到Dave_Admin而不是Dave的原因,因为你的服务是以Dave_Admin身份运行
这篇文章提供了有关如何打开它的信息: http://msdn.microsoft.com/en-us/library/ms730088.aspx