WCF - 获取当前用户身份

时间:2014-07-22 09:17:36

标签: c# wcf iis

我有一个Silverlight应用程序,可以将调用发送到服务器。服务器使用WCF服务来执行调用。如果执行呼叫的用户是我期望的用户,我希望能够检查'AfterReceiveRequest'功能。如果没有 - 我想中止操作。

问题是 - 我无法正确获取IIS用户名。 我试过这个属性:

OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name

只有当我从Visual Studio运行应用程序而不是应用程序池时,它们才会给我正确的用户名。当我在应用程序池上运行应用程序时,我在这两个参数中都获得了值:IIS APPPOOL \ MyApplicationPool。

客户端和服务器位于同一台计算机上,因此这似乎不是双跳。

有人可以帮忙吗?我需要这个在Windows和基本身份验证中工作。

1 个答案:

答案 0 :(得分:0)

这些标识值来自用于WCF的身份验证方法。您应该发布WCF服务器端和客户端配置。要启用使用基于Windows身份验证的加密握手方式的Windows身份验证,请按照本文的示例操作:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/how-to-secure-a-service-with-windows-credentials

完成此操作后,您将可以在此处查看Windows身份:

ServiceSecurityContext.Current.PrimaryIdentity

关键是要在服务器端的绑定级别上打开安全模式。

在代码中:

    var myBinding = new WSHttpBinding();
    myBinding.Security.Mode = SecurityMode.Message;

在配置中:

<bindings>  
  <wsHttpBinding>  
   <binding name = "wsHttpBinding_Calculator">  
     <security mode="Message">  
       <message clientCredentialType="Windows"/>  
     </security>  
    </binding>  
  </wsHttpBinding>  
</bindings> 

我认为clientCredentialType =“ Windows”甚至不是必需的,因为如果 未指定,则仍然可以获取Windows用户身份。

回应您关于VS vs. IIS的观点-这不应该成为问题。我要说的是,IIS服务以某种方式无法访问Active Directory域。这可能是权限问题。但是,默认情况下,IIS应该以与Visual Studio相同的方式工作,因为Visual Studio仅使用IIS Express。如果IIS使用与IIS Express相同的用户名配置,则它应该有权以相同的方式通过域进行身份验证。注意:ServiceSecurityContext.Current.PrimaryIdentity不是IIS用户名。这是Windows用户名。