WCF服务中的身份验证

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绑定..这种绑定是否足以支持安全模型?

mar*_*c_s 6

在服务器端,您可以使用传入的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文档.