我使用下面的代码片段在我的 WCF 服务中获取客户端用户名。在我的一台服务器上,我得到了错误的客户端名称。我的客户端是 Win7 在工作组配置中与 Server 2008R2 通信,两台机器都有用户Dave
和Dave_Admin
. 两者都是 Win7 上的管理员,只有后者是服务器上的管理员。问题是我启动我的客户端,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);
}
}
}