Ash*_*shu 3 wcf wcf-client wcf-security
我在另一台机器上部署了WCF服务,我想根据WCF服务对客户端进行身份验证.
我做了以下事情:
1)在IIS中,我取消选中匿名访问并选中"集成Windows身份验证"复选框.
2)我的Web配置
<authentication mode="Windows" />
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBind">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
3)在客户端,我传递的用户凭证如下:
MyServiceClient _client;
_client = new MyServiceClient();
_client.ClientCredentials.Windows.ClientCredential.UserName = "username";
_client.ClientCredentials.Windows.ClientCredential.Password = "password";
_client.ClientCredentials.Windows.ClientCredential.Domain = "mydomain";
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在服务器端(部署服务的位置)捕获用户名和密码?
如何根据传递的凭据对用户进行身份验证?
目前我正在使用basichttp绑定..这种绑定是否足以支持安全模型?
在服务器端,您可以使用传入的Windows凭据对Active Directory进行身份验证,或者您需要使用备用存储来处理用户身份验证.
您可以使用以下命令访问服务器端代码中的呼叫者身份:
IIdentity caller = ServiceSecurityContext.Current.PrimaryIdentity;
Run Code Online (Sandbox Code Playgroud)
您还可以通过选中,检查Windows用户是否使用其Windows凭据(如示例中)进行调用
ServiceSecurityContext.Current.WindowsIdentity
Run Code Online (Sandbox Code Playgroud)
如果它为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>
Run Code Online (Sandbox Code Playgroud)
这样,只有在Windows域中注册的用户甚至可以调用该服务.任何其他用户将被拒绝,而无需任何额外的工作.
一旦您有Windows用户呼叫,您可以查看ServiceSecurityContext.Current.WindowsIdentity以获取有关谁正在呼叫的信息.
有关服务安全上下文或Windows标识上可用内容的详细信息,请查看MSDN文档.
渣