Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing WCF client credentials from the service

I have the following call to a WCF service (using basic authentication):

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

client.MyServiceFunction();

On the server, I have:

class MyService : IMyService
{
    string MyServiceFunction()
    {
         return GetUsernameHere();
    }
}

My question is, can I access these credentials in the WCF service and, if so, how? That is, how would I implement the GetUsernameHere function?

like image 541
Paul Michaels Avatar asked Mar 12 '14 11:03

Paul Michaels


Video Answer


1 Answers

For this type of validation to work you must write your own validator for the username and password.

You create a class that inherits from UserNamePasswordValidator and specify it in your webconfig like this:

    <serviceBehaviors>
      <behavior name="CustomValidator">
        <serviceCredentials>
          <userNameAuthentication
            userNamePasswordValidationMode="Custom"
            customUserNamePasswordValidatorType=
 "SomeAssembly.MyCustomUserNameValidator, SomeAssembly"/>
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>

The custom validator class will look like this:

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

        // Do your username and password check here

    }
}

The password is not available outside of the validation portion of WCF so you can only retrieve it using the custom validator.

However if you just want the username, it should be accessible via:

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name

however you may need to specify <message establishSecurityContext="true" /> as part of your binding's security, and this isn't available on all bindings eg. basicHttpBinding

<bindings>
  <wsHttpBinding>
    <!-- username binding -->
    <binding name="Binding">
      <security mode="Message">
        <message clientCredentialType="UserName" establishSecurityContext="true" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
like image 122
NibblyPig Avatar answered Sep 23 '22 00:09

NibblyPig