WCF nom d'utilisateur d'Authentification: puis-je obtenir le nom d'utilisateur personnalisé dans un ServiceAuthorizationManager?

J'ai un service WCF qui est à l'aide d'un custom ServiceAuthorizationManager. La coutume auth manager est déjà mis en place pour gérer les Fenêtres et les Formes d'authentification.

Cependant, si je me connecte avec un client qui est mis à UserName auth, je n'arrive pas à trouver le nom de l'utilisateur n'importe où.

Le client code ressemble à ceci:

this.ClientCredentials.UserName.UserName = "user";
this.ClientCredentials.UserName.Password = "pass";
this.Open();
this.MyMethod(); //my actual contract method
this.Close();

Puis sur le serveur, j'ai mon personnalisée auth manager:

public sealed class AppAuthorizationManager : ServiceAuthorizationManager
{
    public override bool CheckAccess(OperationContext operationContext, ref Message message)
    {
        //would like to check user/pwd here...
    }
}

Est-ce possible?

  • La Thread.CurrentPrincipal n'est pas définie,
  • operationContext.ServiceSecurityContext.PrimaryIdentity n'est pas définie.
  • operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets est vide.

Est le user/pwd censé être disponible n'importe où? Ou dois-je ajouter un UsernamePasswordValidator trop?


Mise à jour: j'ai Donc ajouté une coutume UserNamePasswordValidator et un IAuthorizationPolicy.
Ma mise à jour de la WCF config ressemble à ceci:

<behavior name="Server2ServerBehavior">
  <serviceMetadata httpGetEnabled="true" />
  <serviceDebug includeExceptionDetailInFaults="true" />
  <serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="MyApp.AuthManager, MyApp">
    <authorizationPolicies>
      <add policyType="MyApp.TokenAuthorizationPolicy, MyApp" />
    </authorizationPolicies>
  </serviceAuthorization>
  <serviceCredentials>
    <userNameAuthentication customUserNamePasswordValidatorType="MyApp.PFUserNameValidator, MyApp" />
  </serviceCredentials>
</behavior>

Si j'ai mis un point d'arrêt dans tous les 3 de ces classes, WCF lève l'exception:

LogonUser failed for the 'username' user. Ensure that the user has a valid Windows account.
   at System.IdentityModel.Selectors.WindowsUserNameSecurityTokenAuthenticator.ValidateUserNamePasswordCore(String userName, String password)

Avant tout d'entre eux sont exécutés. Hmmm...

OriginalL'auteur CodingWithSpike | 2009-02-09