Cómo: Tener acceso a las notificaciones en una página de ASP.NET

Windows® Identity Foundation (WIF) proporciona controles en tiempo de diseño y el modelo de programación WS-Federated Authentication Module (WS-FAM) para permitir que los desarrolladores de ASP.NET acepten los tokens del llamador de una página de ASP.NET. Estos tokens contienen información sobre el llamador, que WIF expone al desarrollador como notificaciones. En este tema se muestra cómo tener acceso a estas notificaciones.

Para tener acceso a las notificaciones

Para tener acceso a información relativa a la identidad, puede ejecutar FedUtil. Para obtener más información, vea Establecer la confianza de una aplicación de usuario de confianza de ASP.NET a un STS mediante FedUtil. Cuando haya ejecutado FedUtil, su aplicación puede tener acceso a IClaimsPrincipal y IClaimsIdentity utilizando construcciones de ASP.NET estándar tal como se muestra en el siguiente ejemplo de código:

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = Thread.CurrentPrincipal as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claims foreach(Claim claim in claimsIdentity.Claims) {

    } }

Para enumerar las notificaciones de un usuario

Cuando tiene acceso a IClaimsIdentity, puede enumerar las notificaciones recorriendo en iteración su colección de notificaciones. El siguiente ejemplo de código muestra todas las propiedades de notificación (es decir, los tipos de notificación, valores de notificación y tipos de valor de notificación) que WIF extrae del token de seguridad entrante. También, vea el ejemplo Introducción/Aplicación web para notificaciones simple en el directorio de ejemplo.

Nota

No utilice el siguiente código de ejemplo en producción. En el código de producción, debería considerar cuidadosamente las implicaciones de seguridad de mostrar las propiedades de notificaciones a los clientes. Por ejemplo, debería considerar aceptar solo los tipos de notificación que esperan las aplicaciones de usuario de confianza, depurando las propiedades de notificación antes de utilizarlas, y filtrando las notificaciones que contienen datos personales confidenciales.

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = Thread.CurrentPrincipal as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claims foreach(Claim claim in claimsIdentity.Claims) { Response.Write(claim.ClaimType) + "<BR>"; Response.Write(claim.Value) + "<BR>"; Response.Write(claim.ValueType) + "<BR>"; } }

Para tener acceso a una notificación concreta

Cuando tenga acceso a IClaimsIdentity, puede tener acceso a una notificación concreta buscando un tipo notificación determinado en la colección Claims. Puede hacer esto recorriendo en iteración las notificaciones de la colección o utilizando LINQ.

El siguiente ejemplo de código muestra cómo hacer esto recorriendo en iteración las notificaciones de la colección.

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = User as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claims foreach(Claim claim in claimsIdentity.Claims) { if(claim.ClaimType == "http://GenevaFramework/AgeClaim") { Response.Write("Age Claim: " + claim.Value); break; } } }

El siguiente ejemplo de código muestra cómo hacer esto utilizando LINQ.

void Page_Load(object sender, EventArgs e) { // Cast the Thread.CurrentPrincipal IClaimsPrincipal icp = User as IClaimsPrincipal;

    // Access IClaimsIdentity which contains claims IClaimsIdentity claimsIdentity = (IClaimsIdentity)icp.Identity;
    
    // Access claim string ageClaimValue;

    try { ageClaimValue = ( from c in claimsIdentity.Claims where c.ClaimType == "http://GenevaFramework/AgeClaim" select c.Value ).Single(); } catch (InvalidOperationException) { ageClaimValue = "Age claim wasn’t found or " + "there were more than one Age claims provided"; }

    Response.Write("Age Claim: " + ageClaimValue); }