为什么WCF OperationContext出错WindowsIdentity

时间:2012-12-20 05:55:54

标签: wcf windows-identity

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

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

  1. 服务器以某种方式找到用户Dave_Admin寻找我怀疑的Dave,或者
  2. 设置完成后,我可能已将管理用户Dave重命名为Dave_Admin,然后以标准用户身份创建了新用户Dave
  3. 我只有一个模糊的回忆我可能已经这样做但不确定我是否做过。 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);
          }
       }
    }    
    

1 个答案:

答案 0 :(得分:0)

你需要在你的WCF服务上启用模拟,以便你的代码能够获得客户端上下文,否则你将获得服务上下文(这可能是你得到Dave_Admin而不是Dave的原因,因为你的服务是以Dave_Admin身份运行

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