Partilhar via


Como: Implementar a Autorização de Sinistros num pedido de ASP.NET consciente de sinistros utilizando WIF e ACS

Atualizado: 19 de junho de 2015

Aplica-se a: Azure

Aplica-se A

  • Microsoft® Azure™ Controlo de Acesso Service (ACS)

  • ® Fundação Windows identidade (WIF)

  • ASP.NET

Resumo

Este tópico descreve como implementar a autorização de sinistros baseados Controlo de Acesso (CBAC) em aplicações web ASP.NET conscientes de sinistros utilizando WIF e ACS.

Conteúdos

  • Objetivos

  • Descrição Geral

  • Resumo dos Passos

  • Passo 1 - Implementar uma Biblioteca de Autorização de Sinistros

  • Passo 2 – Configurar um ASP.NET pedido de utilização da Biblioteca de Autorização de Sinistros

  • Passo 3 - Configurar uma Política de Autorização

  • Itens Relacionados

Objetivos

  • Externalizar a lógica de autorização da aplicação.

  • Implementar os controlos de autorização para além das funções, resultando num controlo mais detalhado sobre a autorização.

  • Prever a gestão de políticas, declarativas, de autorização.

Descrição Geral

A autorização de sinistros baseia-se na utilização das informações que são transportadas dentro de um token — as alegações. A autorização de sinistros é útil, quando é insuficiente tomar a decisão de autorização baseada apenas em funções. Por exemplo, em aplicações financeiras, o mesmo papel pode ser atribuído a diferentes limites para a transferência de dinheiro entre contas baseadas em posse e outros atributos. Tais atributos podem vir sob a forma de uma reclamação juntamente com o papel e, portanto, permitir uma decisão de autorização mais afinada.

Resumo dos Passos

  • Passo 1 - Implementar uma Biblioteca de Autorização de Sinistros

  • Passo 2 – Configurar um ASP.NET pedido de utilização da Biblioteca de Autorização de Sinistros

  • Passo 3 - Configurar uma Política de Autorização

Passo 1 - Implementar uma Biblioteca de Autorização de Sinistros

Este passo mostra-lhe como criar uma biblioteca de classes externas que irá ler uma política de acesso a partir de um ficheiro de configuração e fazer cumprir as verificações de acesso. A amostra que se segue mostra como implementar uma biblioteca de autorização de sinistros que toma uma decisão de autorização com base numa reclamação de código POSTAL.

Implementar biblioteca de autorização de sinistros

  1. Certifique-se de que está a executar Visual Studio ® no modo Administrador.

  2. Clique com o botão direito na solução desejada em Explorador de Soluções, adicione um novo projeto de Biblioteca de Classes e, em seguida, dê-lhe um nome, por exemplo, MyClaimsAuthorizationManager.

  3. Elimine a classe predefinida , Classe1.cs.

  4. Adicione uma nova classe e dê-lhe um nome, por exemplo, ZipClaimsAuthorizationManager. Isto implementará uma autorização baseada em códigos postais.

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

  6. Adicione as seguintes declarações.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Alargar a classe ClaimsAuthorizationManager , sobrepor o seu método AccessCheck e, em seguida, implementar um construtor para a sua classe ZipClaimsAuthorizationManager . O 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. Compilar a solução para se certificar de que não existem erros de compilação.

  9. Localize a biblioteca compilada, neste caso MyClaimsAuthorizationManager.dll. Terá de ser colocado na pasta do caixote do lixo da aplicação web ASP.NET.

Passo 2 – Configurar um ASP.NET pedido de utilização da Biblioteca de Autorização de Sinistros

Os próximos passos são realizados na sua aplicação web ASP.NET. Não adicione uma referência à biblioteca do Gestor de Autorização de Sinistros que criou no passo anterior. A sua aplicação web ASP.NET deve ser "desprevenida", exceto em web.config.

Para configurar um pedido de ASAP.NET para utilizar a Biblioteca de Autorização de Sinistros

  1. Configure a sua aplicação web ASP.NET para incluir wifs ClaimsAuthorizationModule no seu pipeline adicionando a seguinte entrada na secção HttpModules no web.config (válido para o servidor web de desenvolvimento que envia com Visual Studio; para Serviços de Informação Internet (IIS) versão 7, esta configuração deve ser localizada na secção de módulos sob o nó system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Configure a sua ASP.NET aplicação web para utilizar a biblioteca de autorização personalizada que implementou no passo anterior, adicionando a seguinte entrada no nó microsoft.identityModel.service.

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

Passo 3 - Configurar uma Política de Autorização

Neste tópico, a política de configuração é expressa no ASP.NET aplicação web web.config ficheiro. A política acarreta regras simples que mapeiam recursos para o tipo de reclamação e o seu valor. Por exemplo, a seguinte política pode ser lida e aplicada pela biblioteca de autorização personalizada que criou e configurada nos passos anteriores. Adicione a seguinte entrada ao nó de Autoria de Reclamações Configurado no passo anterior.

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

A política acima requer que um token de entrada deve ter uma reclamação zip com um valor de 11111 para aceder à página padrão.aspx.