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
Verifique se você está executando o Visual Studio® no modo Administrador.
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.
Exclua a classe padrão Class1.cs.
Adicione uma nova classe e atribua um nome a ela, por exemplo, ZipClaimsAuthorizationManager. Ela implementará uma autorização baseada em códigos postais.
Adicione uma referência aos assemblies Microsoft.IdentityModel e System.Web.
Adicione as seguintes declarações.
using System.IO; using System.Xml; using Microsoft.IdentityModel.Claims; using Microsoft.IdentityModel.Configuration;
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; } } }
Compile a solução para ter certeza de que não há erros de compilação.
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
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" />
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.