0

我使用下面的代码片段在我的 WCF 服务中获取客户端用户名。在我的一台服务器上,我得到了错误的客户端名称。我的客户端是 Win7 在工作组配置中与 Server 2008R2 通信,两台机器都有用户DaveDave_Admin. 两者都是 Win7 上的管理员,只有后者是服务器上的管理员。问题是我启动我的客户端,Dave服务器将客户端显示为Dave_Admin. 我已将连接双方的身份调试为客户端上的 Dave 和服务器上的 Dave_Admin。声明资源还显示Dave_AdminSID。

我能想象发生这种情况的唯一两个原因是

  1. 服务器以某种方式找到Dave_AdminDave我怀疑的用户,或者
  2. 设置后,我可能已将管理用户重命名DaveDave_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);
      }
   }
}    
4

1 回答 1

0

您需要在 WCF 服务上打开 Impersonation 以便您的代码能够获取客户端上下文,否则您将获得服务上下文(这可能是您获得 Dave_Admin 而不是 Dave 的原因,因为您的服务以 Dave_Admin 身份运行)

这篇文章有关于如何打开它的信息:http: //msdn.microsoft.com/en-us/library/ms730088.aspx

于 2012-12-20T22:11:03.730 回答