我在另一台机器上部署了WCF服务,我想根据WCF服务对客户端进行身份验证。
我做了以下事情:
1)在IIS中,我取消选中匿名访问并选中“集成Windows身份验证”复选框。
2)我的网络配置
<authentication mode="Windows" />
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBind">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>
</bindings>
3)在客户端,我传递的用户凭证如下:
MyServiceClient _client;
_client = new MyServiceClient();
_client.ClientCredentials.Windows.ClientCredential.UserName = "username";
_client.ClientCredentials.Windows.ClientCredential.Password = "password";
_client.ClientCredentials.Windows.ClientCredential.Domain = "mydomain";
我的问题是如何在服务器端(部署服务的位置)捕获用户名和密码?
如何根据传递的凭据对用户进行身份验证?
目前我正在使用basichttp绑定..这种绑定是否足以支持安全模型?
答案 0 :(得分:6)
在服务器端,您可以使用传入的Windows凭据对Active Directory进行身份验证,或者您需要使用备用存储来处理用户身份验证。
您可以使用以下方法在服务器端代码中访问来电者的身份:
IIdentity caller = ServiceSecurityContext.Current.PrimaryIdentity;
您还可以通过检查
来检查Windows用户是否使用其Windows凭据进行调用(如示例中所示)ServiceSecurityContext.Current.WindowsIdentity
如果它为NULL,则没有传递任何Windows凭据 - 否则您可以使用此Windows身份来检查谁正在呼叫(名称等) - 但您将无法读取用户的密码!你可以查看他的名字,他所属的团体等等。
要使用Windows / Active Directory验证,请将clientCredentialType设置为“Windows”。您可能必须切换到wsHttpBinding,甚至更好:netTcpBinding(如果您位于防火墙后面的Windows LAN上)。
<bindings>
<netTcpBinding>
<binding name="WindowsSecured">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
这样,只有在Windows域中注册的用户才能调用该服务。任何其他用户将被拒绝,而无需任何额外的工作。
一旦您有Windows用户呼叫,您可以查看ServiceSecurityContext.Current.WindowsIdentity以获取有关谁正在呼叫的信息。
检查MSDN docs以获取有关服务安全上下文或Windows identity上可用内容的详细信息。
马克
答案 1 :(得分:0)
您似乎需要自定义用户名和密码验证程序。有一篇MSDN文章涵盖了所有步骤:How to: Use a Custom User Name and Password Validator。
BasicHttpBinding支持多种安全模式。如果您使用重载的构造函数,则可以为BasicHttpSecurityMode传入您选择的值。