Como implementar a autorização de declarações em um aplicativo de ASP.NET com reconhecimento de declarações usando WIF e ACS

Atualizado em: 19 de junho de 2015

Aplica-se ao Azure

Aplica-se A

  • Serviço de Controle de Acesso (ACS) do Microsoft® Azure™

  • SDK do Windows® Identity Foundation (WIF)

  • ASP.NET

Resumo

Este tópico descreve como implementar a autorização do CBAC (Controle de Acesso Baseado em Declarações) em aplicativos Web com reconhecimento de declarações ASP.NET usando WIF e ACS.

Sumário

  • Objetivos

  • Visão geral

  • Resumo das etapas

  • Etapa 1 – Implementar uma Biblioteca de Autorizações de Declarações

  • Etapa 2 – Configurar um aplicativo ASP.NET para usar a Biblioteca de Autorizações de Declarações

  • Etapa 3 – Configurar uma política de autorização

  • Itens relacionados

Objetivos

  • Externalize a lógica da autorização do aplicativo.

  • Implemente as verificações de autorização além das funções para ter um controle maior sobre a autorização.

  • Ofereça um gerenciamento de autorizações declarativo e orientado por política.

Visão geral

A autorização de declarações é baseada no uso das informações contidas em um token, as declarações. A autorização de declarações é útil quando não for suficiente tomar uma decisão de autorização com base apenas em funções. Por exemplo, em aplicativos financeiros, a mesma função pode ser atribuída a limites diferentes de transferência de dinheiro entre contas com base em direitos e outros atributos. Esses atributos podem vir na forma de uma declaração, junto com a função e, consequentemente, permitir uma decisão de autorização mais ajustada.

Resumo das etapas

  • Etapa 1 – Implementar uma Biblioteca de Autorizações de Declarações

  • Etapa 2 – Configurar um aplicativo ASP.NET para usar a Biblioteca de Autorizações de Declarações

  • Etapa 3 – Configurar uma política de autorização

Etapa 1 – Implementar uma Biblioteca de Autorizações de Declarações

Esta etapa mostra como criar uma biblioteca de classes externa que lerá uma política de acesso em um arquivo de configuração e aplicará as verificações de acesso. O exemplo seguinte mostra como implementar uma biblioteca de autorizações de declarações que toma decisões de autorização com base em uma declaração de CEP.

Para implementar a biblioteca de autorizações de declarações

  1. Verifique se você está executando o Visual Studio® no modo Administrador.

  2. Clique com o botão direito do mouse na solução desejada no Gerenciador de Soluções, adicione um novo projeto de Biblioteca de Classes e atribua um nome a ele, por exemplo, MyClaimsAuthorizationManager.

  3. Exclua a classe padrão Class1.cs.

  4. Adicione uma nova classe e atribua um nome a ela, por exemplo, ZipClaimsAuthorizationManager. Ela implementará uma autorização baseada em códigos postais.

  5. Adicione uma referência aos assemblies Microsoft.IdentityModel e System.Web.

  6. Adicione as seguintes declarações.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Estenda a classe ClaimsAuthorizationManager, substituindo seu método AccessCheck e, em seguida, implementando um construtor à sua classe ZipClaimsAuthorizationManager. A aparência do seu código deve ser semelhante ao seguinte:

    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 a solução para ter certeza de que não há erros de compilação.

  9. Localize a biblioteca compilada, neste caso MyClaimsAuthorizationManager.dll. Será necessário movê-la para a pasta bin do aplicativo Web ASP.NET.

Etapa 2 – Configurar um aplicativo ASP.NET para usar a Biblioteca de Autorizações de Declarações

As próximas etapas são realizadas em seu aplicativo Web ASP.NET. Não adicione uma referência à biblioteca Gerenciador de Autorizações de Declarações criada na etapa anterior. Seu aplicativo Web ASP.NET “não deve saber dela”, exceto no arquivo web.config.

Para configurar um aplicativo ASAP.NET para usar com a Biblioteca de Autorizações de Declarações

  1. Configure seu aplicativo Web ASP.NET para incluir ClaimsAuthorizationModule do WIF em seu pipeline adicionando a seguinte entrada à seção HttpModules no arquivo web.config (válido para o servidor Web de desenvolvimento fornecido com o Visual Studio. Para o Internet Information Services (IIS) versão 7, essa configuração pode ser encontrada na seção de módulos no nó system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Configure seu aplicativo Web ASP.NET para usar a biblioteca de autorizações personalizada que você implementou na etapa anterior adicionando a seguinte entrada no nó microsoft.identityModel.service.

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

Etapa 3 – Configurar uma política de autorização

Neste tópico, a política de configuração está expressa no arquivo web.config do aplicativo Web ASP.NET. A política contém regras simples que mapeiam recursos para o tipo de declaração e seu valor. Por exemplo, a seguinte política pode ser lida e aplicada pela biblioteca de autorizações personalizada que você criou nas etapas anteriores. Adicione a seguinte entrada ao nó claimsAuthorizationManager que você configurou na etapa anterior.

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

A política acima exige que um token de entrada tenha uma declaração de CEP com o valor 11111 para acessar a página default.aspx.