从服务访问WCF客户端凭据

Pau*_*els 7 .net c# vb.net wcf basic-authentication

我有一个WCF服务的以下调用(使用基本身份验证):

client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";

client.MyServiceFunction();
Run Code Online (Sandbox Code Playgroud)

在服务器上,我有:

class MyService : IMyService
{
    string MyServiceFunction()
    {
         return GetUsernameHere();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以在WCF服务中访问这些凭据,如果是,如何访问?也就是说,我该如何实现这个GetUsernameHere功能呢?

Nib*_*Pig 7

要使此类验证起作用,您必须为用户名和密码编写自己的验证器.

您创建一个继承自UserNamePasswordValidator并在webconfig中指定的类,如下所示:

    <serviceBehaviors>
      <behavior name="CustomValidator">
        <serviceCredentials>
          <userNameAuthentication
            userNamePasswordValidationMode="Custom"
            customUserNamePasswordValidatorType=
 "SomeAssembly.MyCustomUserNameValidator, SomeAssembly"/>
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)

自定义验证器类将如下所示:

public class MyCustomUserNameValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {

        // Do your username and password check here

    }
}
Run Code Online (Sandbox Code Playgroud)

密码在WCF的验证部分之外不可用,因此您只能使用自定义验证器检索密码.

但是,如果您只想要用户名,则应通过以下方式访问:

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name

但是,您可能需要指定<message establishSecurityContext="true" />作为绑定安全性的一部分,并且这不适用于所有绑定,例如.basicHttpBinding的

<bindings>
  <wsHttpBinding>
    <!-- username binding -->
    <binding name="Binding">
      <security mode="Message">
        <message clientCredentialType="UserName" establishSecurityContext="true" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)