En la anterior entrada hablamos sobre las nuevas herramientas de la plataforma de Identity disponibles para .NET 4.5 y como estas nuevas herramientas nos aportaban nuevas mejoras y funcionalidades. De la primera de esas funcionalidades que hablaremos es del Local STS.
Local STS
Cuando decidimos desarrollar un proyecto y delegar la gestión de la identidad a un tercero, en nuestra terminología a un Security Token Service, siempre tenemos la posibilidad de que esa pieza no esté disponible o quizás que no tengamos acceso a la misma. Por ejemplo, si vamos a desplegar el producto en una organización, es casi seguro que la misma disponga de un ADFS sobre el que podamos trabajar, sin embargo, en tiempo de desarrollo probablemente no lo podamos ni tocar. Conscientes de esto, el equipo de Identity, pone a nuestra disposición la posibilidad de que desarrollemos una RP usando un STS local o simulado, que nos permita trabajar como si de un ADFS ( u otro bussiness STS ) se tratara.
Con el fin de mostrar un ejemplo de esto crearemos un nuevo proyecto de MVC 4 en nuestro Visual Studio 2012 al que configuraremos con las herramientas de Identity, vistas en la entrada anterior. Si se fija en la figura 1, en las distintas ‘tabs’ que tenemos en la ventana podemos seleccionar la dedicada a configurar como funcionará nuestro Local STS, desde el protocolo por defecto SAML 1.1 o SAML 2.0 hasta el puerto de nuestro Local STS en la máquina.
Por supuesto a mayores de esto, también podemos configurar las claims que serán devueltas por cualquier petición de un token, WS-Trust, para cualquier usuario. Esta información de claims es guardada a nivel de proyecto en un archivo llamado LocalSTS.exe.config que contendría algo similar a lo siguiente:
1 |
<?xml version=<span style="color: #006080">"1.0"</span> encoding=<span style="color: #006080">"utf-8"</span>?> |
1 |
<configuration> |
1 |
<configSections> |
1 |
<section name=<span style="color: #006080">"localSTSConfiguration"</span> type=<span style="color: #006080">"System.IdentityModel.Tools.LocalSTS.LocalSTSConfiguration, LocalSTS, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</span> /> |
1 |
</configSections> |
1 |
<startup> |
1 |
<supportedRuntime version=<span style="color: #006080">"v4.0"</span> sku=<span style="color: #006080">".NETFramework,Version=v4.5"</span> /> |
1 |
</startup> |
1 |
<localSTSConfiguration port=<span style="color: #006080">"13855"</span> signingCertificate=<span style="color: #006080">"LocalSTS.pfx"</span> signingCertificatePassword=<span style="color: #006080">"LocalSTS"</span> issuerName=<span style="color: #006080">"LocalSTS"</span> tokenFormat=<span style="color: #006080">"Saml11"</span>> |
1 |
<claims> |
1 |
<add type=<span style="color: #006080">"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"</span> displayName=<span style="color: #006080">"Name"</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">"Terry"</span> /> |
1 |
<add type=<span style="color: #006080">"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"</span> displayName=<span style="color: #006080">"Surname"</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">"Adams"</span> /> |
1 |
<add type=<span style="color: #006080">"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"</span> displayName=<span style="color: #006080">"Role"</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">"developer"</span> /> |
1 |
</claims> |
1 |
</localSTSConfiguration> |
1 |
</configuration> |
Seguramente, si está desarrollando una solución empresarial, dentro de los distintos escenarios que tendrá, existirán aquellos en los que haga una validación de las claims para algún mecanismo de authorización. Para hacer más agil esto a los desarrolladores, en vez de modificar a mano este archivo para dar soporte a distintos perfiles sería conveniente realizar algún script de power shell que nos facilitara la vida. [Es probable que esto sea una de esas miles de cosas que uno tiene como propósito para hacer en vacaciones]
Una vez que hemos terminado de configurar nuestro Local STS podemos ver como la configuración de nuestro proyecto MVC ha cambiado, para verlo nos iremos a nuestro web.config y observaremos los siguientes elementos.
- Nuevas secciones de configuración: Lo primero que hace es agregarnos las secciones de configuración relativas a System.IdentityModel.
1 |
<section name=<span style="color: #006080">"system.identityModel"</span> |
1 |
type=<span style="color: #006080">"System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"</span> |
1 |
/> |
1 |
section name=<span style="color: #006080">"system.identityModel.services"</span> |
1 |
type=<span style="color: #006080">"System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"</span> |
1 |
/> |
- Agrega los módulos de System.IdentityModel, el de establecimiento de la sessión que ya vimos anteriormente y el de WS-Federation que conocemos de WIF
1 |
<system.webServer> |
1 |
<validation validateIntegratedModeConfiguration=<span style="color: #006080">"false"</span> /> |
1 |
<modules> |
1 |
<add name=<span style="color: #006080">"WSFederationAuthenticationModule"</span> |
1 |
type=<span style="color: #006080">"System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"</span> |
1 |
/> |
1 |
<add name=<span style="color: #006080">"SessionAuthenticationModule"</span> |
1 |
type=<span style="color: #006080">"System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"</span> |
1 |
/> |
1 |
</modules> |
1 |
</system.webServer> |
- Agregamos la configuración de System.IdentityModel, apuntando a nuestro STS local
1 |
<system.identityModel> |
1 |
<identityConfiguration> |
1 |
<audienceUris> |
1 |
<add <span style="color: #0000ff">value</span>=<span style="color: #006080">"http://localhost:1073/"</span> /> |
1 |
</audienceUris> |
1 |
<issuerNameRegistry type=<span style="color: #006080">"System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"</span>> |
1 |
<trustedIssuers> |
1 |
<add thumbprint=<span style="color: #006080">"9B74CB2F320F7AAFC156E1252270B1DC01EF40D0"</span> name=<span style="color: #006080">"LocalSTS"</span> /> |
1 |
</trustedIssuers> |
1 |
</issuerNameRegistry> |
1 |
<certificateValidation certificateValidationMode=<span style="color: #006080">"None"</span> /> |
1 |
</identityConfiguration> |
1 |
</system.identityModel> |
1 |
<system.identityModel.services> |
1 |
<federationConfiguration> |
1 |
<cookieHandler requireSsl=<span style="color: #006080">"false"</span> /> |
1 |
<wsFederation passiveRedirectEnabled=<span style="color: #006080">"true"</span> issuer=<span style="color: #006080">"http://localhost:13855/wsFederationSTS/Issue"</span> realm=<span style="color: #006080">"http://localhost:1073/"</span> reply=<span style="color: #006080">"http://localhost:1073/"</span> requireHttps=<span style="color: #006080">"false"</span> /> |
1 |
</federationConfiguration> |
1 |
</system.identityModel.services> |
Bien, ahora que ya tenemos todo configurado, sin más, podemos iniciar nuestro proyecto y observar las claims del usuario authenticado, para ello podemos poner el siguiente código en Home/Index y observar el resultado.
1 |
var claims = ClaimsPrincipal.Current.Claims; |
Más configuración…
Si se fija en la configuración, hay más elementos que podemos configurar, el valor del issuer, la audiencia, la redirección pasiva o si queremos https y cookies validas para una web farm. Por suerte, estos valores no tenemos que tocarlos en nuestro XML directamente sino que támbién son modifcables en la herramienta de gestión de la identidad en la pestaña de Configuración, tal y como podemos ver en la siguiente imagen.
Saludos
Unai
Estos últimos posts los he dedicado a un tema que muchos sabéis que me gusta, la seguridad de nuestras