Esta documentação foi arquivada e não está sendo atualizada.

Como: Implementar a autorização de declarações para aplicativos ASP.NET com reconhecimento de declarações usando o WIF e o ACS

Publicado: abril de 2011

Atualizado: junho de 2015

Aplica-se a: Azure

  • Microsoft® Azure™ Access Control Service (ACS)

  • SDK do Windows® Identity Foundation (WIF)

  • ASP.NET

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

  • Objetivos

  • Visão geral

  • Resumo de 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

  • 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.

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.

  • 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

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.

  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.

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.

  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" >
    
    

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=http://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.

Mostrar: