Procédure : Ajouter un gestionnaire de jetons personnalisé

Vous pouvez ajouter un gestionnaire de jetons de sécurité personnalisé en créant simplement une classe qui dérive de SecurityTokenHandler ou de l'un de ses descendants, et ajouter votre classe dérivée au fichier web.config ou app.config pour votre application. Notez que si vous souhaitez écrire un gestionnaire de jetons de sécurité personnalisé pour gérer un type de jeton connu, tel que SAML 2 ou X.509, vous devez créer une classe qui dérive de la classe WIF appropriée. Par exemple, pour gérer des jetons SAML 2, vous devez dériver de Saml2SecurityTokenHandler. Cette rubrique indique comment ajouter un gestionnaire de jetons de sécurité personnalisé qui fournit la validation de nom d'utilisateur/mot de passe personnalisée.

Tout d'abord, créez une classe qui dérive de UserNameSecurityTokenHandler et remplace CanValidateToken et ValidateToken.

using Microsoft.IdentityModel.SecurityTokenService; using Microsoft.IdentityModel.Tokens;

namespace SimpleCustomSecurityTokenHandler { public class CustomUserNamePasswordValidatorSecurityTokenHandler : UserNameSecurityTokenHandler { /* Important: You must override CanValidateToken and return true, or your token handler will not be used. */ public override bool CanValidateToken { get { return true; } }

        public override ClaimsIdentityCollection ValidateToken(SecurityToken token) { if (token == null) { throw new ArgumentNullException(); } UserNameSecurityToken UNtoken = token as UserNameSecurityToken; if (UNtoken == null) { throw new SecurityTokenException("Invalid token"); }

/* Validate UNtoken.UserName and UNtoken.Password here. */

            Claim claim = new Claim(System.IdentityModel.Claims.ClaimTypes.Name, UNtoken.UserName); IClaimsIdentity identity = new ClaimsIdentity(nameClaim,"Password"); identity.Claims.Add( new Claim("https://schemas.microsoft.com/ws/2008/06/identity/claims/ClaimTypes.AuthenticationInstant", XmlConvert.ToString(DateTime.UtcNow, "yyyy-MM-ddTHH:mm:ss.fffZ"), "http://www.w3.org/2001/XMLSchema#dateTime") ); identity.Claims.Add( new Claim("https://schemas.microsoft.com/ws/2008/06/identity/claims/ClaimTypes.AuthenticationMethod", "https://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password") ); return new ClaimsIdentityCollection(new IClaimsIdentity[] { identity }); } } }

Ensuite, ajoutez le gestionnaire de jetons personnalisé à la configuration du service en ajoutant la balise suivante à la section configuration du fichier app.config du service.

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!-- Registers the microsoft.IdentityModel configuration section --> <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </configSections> <microsoft.identityModel> <service> <securityTokenHandlers> <remove type="Microsoft.IdentityModel.Tokens.WindowsUserNameSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add type="SimpleCustomSecurityTokenHandler.CustomUserNamePasswordValidatorSecurityTokenHandler, SimpleCustomSecurityTokenHandler"/> </securityTokenHandlers> </service> </microsoft.identityModel> </configuration>

Notez que nous ajoutons notre gestionnaire de jetons de sécurité personnalisé, CustomUserNamePasswordValidatorSecurityTokenHandler, mais supprimons également le gestionnaire de jetons de sécurité de nom d'utilisateur/mot de passe par défaut, WindowsUserNameSecurityTokenHandler. En effet, la collection de gestionnaires de jetons WIF contiendra, par défaut, un seul gestionnaire de jetons pour chaque type de jeton. Il existe une relation un-à-un entre les gestionnaires de jetons et les types de jetons, donc vous ne devez pas écrire de gestionnaire de jetons personnalisé pour gérer plusieurs types de jetons. Un type de jeton peut être représenté par une ou plusieurs chaînes d'identification de jetons, donc vous pouvez écrire un gestionnaire de jetons personnalisé pour gérer un type de jeton et plusieurs identificateurs de jetons.

Si votre gestionnaire de jetons de sécurité personnalisé remplace ReadToken, il doit également remplacer CanReadToken. De même, s'il remplace WriteToken, il doit également remplacer CanWriteToken.