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";