Compartir a través de


Cómo: Implementar la autorización de notificaciones en una aplicación ASP.NET compatible con notificaciones mediante WIF y ACS

Actualizado: 19 de junio de 2015

Se aplica a: Azure

Se aplica a

  • Microsoft® Azure™ Access Control Service (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

Resumen

En este tema se describe cómo implementar la autorización de Access Control basada en notificaciones (CBAC) en aplicaciones web ASP.NET compatibles con notificaciones mediante WIF y ACS.

Contenido

  • Objetivos

  • Información general

  • Resumen de pasos

  • Paso 1: Implementar una biblioteca de autorización de notificaciones

  • Paso 2: Configurar una aplicación de ASP.NET para que utilice la biblioteca de autorización de notificaciones

  • Paso 3: Configurar una directiva de autorización

  • Elementos relacionados

Objetivos

  • Externalizar la lógica de autorización de la aplicación.

  • Implementar las comprobaciones de autorización más allá de los roles, lo que redunda en un mayor control sobre la autorización.

  • Proporcionar una administración de autorización declarativa y basada en directivas.

Información general

La autorización de notificaciones se basa en la utilización de la información incluida en los tokens: las notificaciones. La autorización de notificaciones resulta útil cuando la utilización de los roles por sí sola es insuficiente para tomar decisiones. Por ejemplo, en aplicaciones financieras, es posible asignar distintas limitaciones al mismo para la transferencia de dinero entre cuentas en función de la antigüedad y de otros atributos. Dichos atributos pueden tener la forma de una notificación junto con el rol, por lo que mejoran la toma de decisiones de autorización.

Resumen de pasos

  • Paso 1: Implementar una biblioteca de autorización de notificaciones

  • Paso 2: Configurar una aplicación de ASP.NET para que utilice la biblioteca de autorización de notificaciones

  • Paso 3: Configurar una directiva de autorización

Paso 1: Implementar una biblioteca de autorización de notificaciones

Este paso muestra cómo crear una biblioteca de clase externa que leerá una directiva de acceso de un archivo de configuración y, a continuación, aplicará las comprobaciones de acceso. El ejemplo siguiente muestra cómo implementar una biblioteca de autorización de notificaciones que permite tomar la decisión de autorización en función de una notificación de código postal.

Para implementar la biblioteca de autorización de notificaciones

  1. Asegúrese de que esté ejecutando Visual Studio® en modo de administrador.

  2. Haga clic con el botón secundario en el Explorador de soluciones, agregue un nuevo proyecto de Biblioteca de clases y asígnele un nombre como, por ejemplo, MyClaimsAuthorizationManager.

  3. Elimine la clase predeterminada, Class1.cs.

  4. Agregue una nueva clase y asígnele un nombre como, por ejemplo, ZipClaimsAuthorizationManager. De este modo, se implementará una autorización basada en códigos postales.

  5. Agregue una referencia a los ensamblados Microsoft.IdentityModel y System.Web.

  6. Agregue las declaraciones siguientes.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Extienda la clase ClaimsAuthorizationManager para anular el método AccessCheck y luego implementar un constructor en la clase ZipClaimsAuthorizationManager. El código debe ser similar al siguiente.

    namespace MyClaimsAuthorizationManager 
    { 
        class ZipClaimsAuthorizationManager : ClaimsAuthorizationManager 
        { 
            private static Dictionary<string, int> m_policies = new Dictionary<string, int>(); 
    
            public ZipClaimsAuthorizationManager(object config) 
            { 
                XmlNodeList nodes = config as XmlNodeList; 
                foreach (XmlNode node in nodes) 
                { 
                    { 
                        //FIND ZIP CLAIM IN THE POLICY IN WEB.CONFIG AND GET ITS VALUE 
                        //ADD THE VALUE TO MODULE SCOPE m_policies 
                        XmlTextReader reader = new XmlTextReader(new StringReader(node.OuterXml)); 
                        reader.MoveToContent(); 
                        string resource = reader.GetAttribute("resource"); 
                        reader.Read(); 
                        string claimType = reader.GetAttribute("claimType"); 
                        if (claimType.CompareTo(ClaimTypes.PostalCode) == 0) 
                        { 
                            throw new ArgumentNullException("Zip Authorization is not specified in policy in web.config"); 
                        } 
                        int zip = -1; 
                        bool success = int.TryParse(reader.GetAttribute("Zip"),out zip); 
                        if (!success) 
                        { 
                            throw new ArgumentException("Specified Zip code is invalid - check your web.config"); 
                        } 
                        m_policies[resource] = zip; 
                    } 
                } 
            } 
            public override bool CheckAccess(AuthorizationContext context) 
            { 
                //GET THE IDENTITY 
                //FIND THE POSTALCODE CLAIM'S VALUE IN IT 
                //COMPARE WITH THE POLICY 
                int allowedZip = -1; 
                int requestedZip = -1; 
                Uri webPage = new Uri(context.Resource.First().Value); 
                IClaimsPrincipal principal = (IClaimsPrincipal)HttpContext.Current.User; 
                if (principal == null) 
                { 
                    throw new InvalidOperationException("Principal is not populate in the context - check configuration"); 
                } 
                IClaimsIdentity identity = (IClaimsIdentity)principal.Identity; 
                if (m_policies.ContainsKey(webPage.PathAndQuery)) 
                { 
                    allowedZip = m_policies[webPage.PathAndQuery]; 
                    requestedZip = -1; 
                    int.TryParse((from c in identity.Claims 
                                            where c.ClaimType == ClaimTypes.PostalCode 
                                            select c.Value).FirstOrDefault(), out requestedZip); 
                } 
                if (requestedZip!=allowedZip) 
                { 
                    return false; 
                } 
                return true; 
            } 
        } 
    }
    
  8. Compile la solución presionando para asegurarse de que no hay ningún error de compilación.

  9. Localice la biblioteca compilada, en este caso MyClaimsAuthorizationManager.dll. Deberá colocar la biblioteca en la carpeta bin de la aplicación web ASP.NET.

Paso 2: Configurar una aplicación de ASP.NET para que utilice la biblioteca de autorización de notificaciones

Los pasos siguientes deben realizarse en la aplicación web ASP.NET. No agregue ninguna referencia a la biblioteca de administrador de autorización de notificaciones creada en el paso anterior. La aplicación web ASP.NET no debe ser “consciente” de que existe, salvo en web.config.

Para configurar la aplicación ASP.NET para que use la biblioteca de autorización de notificaciones

  1. Configure la aplicación web ASP.NET para que incluya el nodo ClaimsAuthorizationModule de WIF en su canalización. Para ello, agregue la entrada siguiente a la sección HttpModules del archivo web.config (válido para el servidor web de desarrollo incluido en Visual Studio; para la versión 7 de Internet Information Services (IIS), esta configuración debe localizarse en los módulos del nodo system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Configure la aplicación web ASP.NET para que utilice la biblioteca de autorización personalizada implementada en el paso anterior. Para ello, agregue la entrada siguiente al nodo microsoft.identityModel.service.

    <claimsAuthorizationManager type="MyClaimsAuthorizationManager.ZipClaimsAuthorizationManager, MyClaimsAuthorizationManager" >
    

Paso 3: Configurar una directiva de autorización

En este tema, la directiva de configuración se expresa en el archivo web.config de la aplicación web ASP.NET. La directiva incluye reglas simples que asignan recursos al tipo de notificación y a su valor. Por ejemplo, la biblioteca de autorización personalizada creada y configurada en los pasos anteriores puede leer y aplicar la directiva siguiente. Agregue la entrada siguiente al nodo claimsAuthorizationManager configurado en el paso anterior.

<policy resource="/default.aspx">
  <claim claimType=https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode
  Zip="11111" />
</policy>

La directiva anterior requiere que el token entrante tenga una notificación de código postal con un valor de 11111 para poder tener acceso a la página default.aspx.