WIF: Custom Security Token Handler

Siempre que uno se pone a jugar con WIF, en general con el concepto de “authentication outsourcing”,  se encuentra con que la mayoría de ejemplos son los sencillos, utilizando autenticación Windows. Sin embargo, en la mayoría de las aplicaciones que construímos, los mecanismos de autenticación ( porque los exponemos por internet o bien porque no tenemos un AD a nuestra disposición con todo el repositorio de usuarios ) suelen diferir de estos. Como en mi correo, el uso de una autenticación “custom” con WIF suele ser una pregunta habitual, me he decidido por poner esta entrada intentando mostrar los pasos necesarios para realizarla. Lógicamente, asumiremos que el lector ya tiene los conocimientos básicos sobre WIF y la situación de las distintas piezas en un escenario básico.

 

Aunque en un principio pudiera parecer que el objetivo a la hora de securizar un STE por medio de una autenticación personalizada pudiera pasar por la configuración del binding del mismo, por otra parte tal y como hacemos en los servicios wcf tradicionales, la realidad es que la integración de WIF con WCF y los hooks de esta API sobre la extensibilidad nos permiten modificar la autenticación en esta pieza, el STE, haciendo uso de los SecurityTokenHandlers y las subclases de esta. La configuración por defecto en la plantilla de STE es seguridad basada en el mensaje con credenciales Windows, por lo tanto usando el WindowsUserNameSecurityTokenHandler. Si quisiéramos cambiar este mecanismo, y por ejemplo, incluir una validación personalizada de usuario/contraseña solamente tendríamos que realizar las siguientes tareas.

  • Modificar el binding del STE para establecer el tipo de credenciales a UserName
       <binding name="ws2007HttpBindingConfiguration">
          <security mode="Message">
            <message establishSecurityContext="false" clientCredentialType="UserName" />
          </security>
        </binding>
  • Crear un CustomUserNameSecurityTokenHandler como sigue:
public class CustomUserNameSecurityTokenHandler
        :UserNameSecurityTokenHandler
    {
        public override bool CanValidateToken
        {
            get
            {
                return true;
            }
        }
        public override Microsoft.IdentityModel.Claims.ClaimsIdentityCollection ValidateToken(System.IdentityModel.Tokens.SecurityToken token)
        {
            UserNameSecurityToken userToken = token as UserNameSecurityToken;
            if (userToken != null)
            {
                string user = userToken.UserName;
                string password = userToken.Password;

                //TODO: Esto es un mejor ejemplo para el blog, 
                //por favor incluir aquí la lógica de validacion necesaria
                if (user.StartsWith("plainconcepts")) 
                {
                    IClaimsIdentity identity = new ClaimsIdentity();
                    identity.Claims.Add(new Claim(WSIdentityConstants.ClaimTypes.Name, user));

                    return new ClaimsIdentityCollection(new IClaimsIdentity[] { identity });
                }
                else
                    throw new InvalidOperationException();
            }
            else
                throw new InvalidOperationException();
        }
    }
  • Configurar dentro del STE la inclusión de este token handler
   <configSections>
    <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="Helper.CustomUserNameSecurityTokenHandler,Helper"/>
      </securityTokenHandlers>
    </service>
  </microsoft.identityModel>
 

Con estos tres pasos básicos ya tenemos nuestro STS funcionando con autenticación personalizada, espero que a alguno le sea de utilidad…

 

Saludos

Unai

Published 7/2/2011 16:50 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2011/02/07/wif-custom-security-token-handler.aspx