Extensibilité de WCF (2/3)

1) Introduction

Nous allons continuer dans l'exploration des fonctionnalités "peu" connues à mes yeux de WCF. Nous avons déjà vu dans le précédent post comment gérer une notion de cache lors des appels client ou serveur, comment alterer les inputs/outputs des appels dans le service,etc...(cfr ce lien). Nous allons voir ici comment mettre en place une sécurité basique login/password dans un contexte sécurisé HTTPS.

2) Mise en place de la sécurité

Nous récupérons notre première solution contenant un service WCF "bête" et méchant. Nous changeons deux parties:
(1) Nous mettons en place la sécurité (je n'ai pas copié tout le fichier de config mais il est évident que dans le <service>, nous devons également changer le binding et passer de http en https. Si vous rencontrez des problèmes de configuration en https, je vous invite à lire ces deux documentations:
(2) Nous allons définir une classe d'authentification "simple" login/pass que nous allons expliquer ci-dessous.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="myBinding">
          <security mode="Message">
            <message clientCredentialType="UserName" /> (1)
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    ...
    <behaviors>
      <serviceCredentials> (2)
        <userNameAuthentication userNamePasswordValidationMode="Custom" 
        customUserNamePasswordValidatorType="WCFImprovements.Server.CustomUserNameValidator,WCFImprovements"/>
      </serviceCredentials>
      ...
    </behaviors>
  </system.serviceModel>
</configuration>

3) Implémentation de la classe "sécurité"

Par défaut, si on ne spécifie pas le point (2) ci-dessus, WCF utilise la sécurité de Windows. Nous avons donc décidé plus haut d'utiliser une classe "custom" pour valider un login password. Cette classe héritera de UserNamePasswordValidator.
namespace WCFImprovements.Server
{
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName != "Thierry" || password != "MonPassDeFou")
                throw new FaultException(new FaultReason("Invalid credentials"));
        }
    }
}
La classe ci-dessous vérifie donc si l'utilisateur est bien "Thierry" (en case sensitive) et si le mot de passe est bien "MonPassDeFou". Si un des deux champs est faux, une exception sera levée au client. Il ne reste plus qu'a s'identifier sur le client.

4) Identification sur le client

Si tôt, l'identification ci-dessous sera ajoutée, mon client pourra à nouveau se reconnecter !
client.ClientCredentials.UserName.UserName = "Thierry";
client.ClientCredentials.UserName.Password = "MonPassDeFou";

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet

Page top