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