我有一个Silverlight应用程序,可以将调用发送到服务器。服务器使用WCF服务来执行调用。如果执行呼叫的用户是我期望的用户,我希望能够检查'AfterReceiveRequest'功能。如果没有 - 我想中止操作。
问题是 - 我无法正确获取IIS用户名。 我试过这个属性:
OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name
和
OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name
只有当我从Visual Studio运行应用程序而不是应用程序池时,它们才会给我正确的用户名。当我在应用程序池上运行应用程序时,我在这两个参数中都获得了值:IIS APPPOOL \ MyApplicationPool。
客户端和服务器位于同一台计算机上,因此这似乎不是双跳。
有人可以帮忙吗?我需要这个在Windows和基本身份验证中工作。
答案 0 :(得分:0)
这些标识值来自用于WCF的身份验证方法。您应该发布WCF服务器端和客户端配置。要启用使用基于Windows身份验证的加密握手方式的Windows身份验证,请按照本文的示例操作:
完成此操作后,您将可以在此处查看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用户名。