ClaimsAuthorizationManager Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет базовую реализацию диспетчера авторизации утверждений.
public ref class ClaimsAuthorizationManager : System::IdentityModel::Configuration::ICustomIdentityConfiguration
public class ClaimsAuthorizationManager : System.IdentityModel.Configuration.ICustomIdentityConfiguration
type ClaimsAuthorizationManager = class
interface ICustomIdentityConfiguration
Public Class ClaimsAuthorizationManager
Implements ICustomIdentityConfiguration
- Наследование
-
ClaimsAuthorizationManager
- Реализации
Примеры
Примеры кода, используемые в разделах ClaimsAuthorizationManager , взяты из Claims Based Authorization
примера. В этом примере предоставляется пользовательский диспетчер авторизации утверждений, который может авторизовать субъекты на основе политики, указанной в конфигурации. Настраиваемый диспетчер авторизации утверждений состоит из трех основных компонентов: класса, производного от ClaimsAuthorizationManager , который реализует диспетчер, ResourceAction
класса, который связывает ресурс и действие, и средства чтения политики, считывающего и компилирующий политику, указанную в файле конфигурации. Затем диспетчер авторизации утверждений может использовать эту скомпилированную политику для оценки субъекта, чтобы авторизовать доступ к ресурсам. Не все элементы отображаются для краткости. Сведения об этом и других примерах, доступных для WIF, а также о том, где их можно скачать, см. в разделе Пример индекса кода WIF.
В следующем коде показана реализация пользовательского диспетчера авторизации утверждений. Метод LoadCustomConfiguration считывает и компилирует политику из конфигурации с помощью вспомогательного класса средства чтения политики (не отображается), а CheckAccess метод предоставляет или запрещает доступ на основе этой политики.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Xml;
namespace ClaimsAuthorizationLibrary
{
/// <summary>
/// Simple ClaimsAuthorizationManager implementation that reads policy information from the .config file
/// </summary>
public class MyClaimsAuthorizationManager : ClaimsAuthorizationManager
{
static Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>> _policies = new Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>>();
PolicyReader _policyReader = new PolicyReader();
/// <summary>
/// Creates a new instance of the MyClaimsAuthorizationManager
/// </summary>
public MyClaimsAuthorizationManager()
{
}
/// <summary>
/// Overloads the base class method to load the custom policies from the config file
/// </summary>
/// <param name="nodelist">XmlNodeList containing the policy information read from the config file</param>
public override void LoadCustomConfiguration(XmlNodeList nodelist)
{
Expression<Func<ClaimsPrincipal, bool>> policyExpression;
foreach (XmlNode node in nodelist)
{
//
// Initialize the policy cache
//
XmlDictionaryReader rdr = XmlDictionaryReader.CreateDictionaryReader(new XmlTextReader(new StringReader(node.OuterXml)));
rdr.MoveToContent();
string resource = rdr.GetAttribute("resource");
string action = rdr.GetAttribute("action");
policyExpression = _policyReader.ReadPolicy(rdr);
//
// Compile the policy expression into a function
//
Func<ClaimsPrincipal, bool> policy = policyExpression.Compile();
//
// Insert the policy function into the policy cache
//
_policies[new ResourceAction(resource, action)] = policy;
}
}
/// <summary>
/// Checks if the principal specified in the authorization context is authorized to perform action specified in the authorization context
/// on the specified resoure
/// </summary>
/// <param name="pec">Authorization context</param>
/// <returns>true if authorized, false otherwise</returns>
public override bool CheckAccess(AuthorizationContext pec)
{
//
// Evaluate the policy against the claims of the
// principal to determine access
//
bool access = false;
try
{
ResourceAction ra = new ResourceAction(pec.Resource.First<Claim>().Value, pec.Action.First<Claim>().Value);
access = _policies[ra](pec.Principal);
}
catch (Exception)
{
access = false;
}
return access;
}
}
}
В следующем коде показан класс, ResourceAction
используемый пользовательским диспетчером утверждений.
using System;
namespace ClaimsAuthorizationLibrary
{
/// <summary>
/// Class to encapsulate resource/action pair
/// </summary>
public class ResourceAction
{
public string Resource;
public string Action;
/// <summary>
/// Checks if the current instance is equal to the given object by comparing the resource and action values
/// </summary>
/// <param name="obj">object to compare to</param>
/// <returns>True if equal, else false.</returns>
public override bool Equals(object obj)
{
ResourceAction ra = obj as ResourceAction;
if (ra != null)
{
return ((string.Compare(ra.Resource, Resource, true) == 0) && (string.Compare(ra.Action, Action, true) == 0));
}
return base.Equals(obj);
}
/// <summary>
/// Gets the hash code.
/// </summary>
/// <returns>The hash code.</returns>
public override int GetHashCode()
{
return (Resource + Action).ToLower().GetHashCode();
}
/// <summary>
/// Creates an instance of ResourceAction class.
/// </summary>
/// <param name="resource">The resource name.</param>
/// <param name="action">The action.</param>
/// <exception cref="ArgumentNullException">when <paramref name="resource"/> is null</exception>
public ResourceAction(string resource, string action)
{
if (string.IsNullOrEmpty(resource))
{
throw new ArgumentNullException("resource");
}
Resource = resource;
Action = action;
}
}
}
В следующем XML-коде показано, как настроить диспетчер авторизации утверждений, показанный выше, для веб-приложения, размещенного в IIS 7.5. Отображаются только элементы, относящиеся к конфигурации диспетчера авторизации утверждений. Обратите внимание, что ссылка на ClaimsAuthorizationModule класс должна быть добавлена в конвейер под элементом <system.Webserver>
. Для сайтов и приложений, размещенных в версиях IIS до IIS 7, модули можно добавить в конвейер под элементом <system.Web>
. Эта конфигурация показана, но закомментирована.
Политика, используемая диспетчером авторизации утверждений, задается пользовательскими <policy>
элементами в элементе <claimsAuthorizationManager> . В первой политике субъект должен обладать одним из указанных утверждений, чтобы выполнить указанное действие с указанным ресурсом. Во второй политике субъект должен обладать обоими утверждениями, чтобы иметь возможность выполнять указанное действие с указанным ресурсом. Во всех остальных ему автоматически предоставляется доступ независимо от утверждений, которыми он обладает.
<configuration>
<configSections>
<!--WIF 4.5 sections -->
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
...
</configSections>
...
<system.web>
<httpModules>
<!--WIF 4.5 modules -->
<!--Not needed here for IIS >= 7 -->
<!--<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>-->
</httpModules>
</system.web>
...
<system.webServer>
<modules>
<!--WIF 4.5 modules -->
<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</modules>
</system.webServer>
...
<!-- WIF 4.5 s.im section-->
<system.identityModel>
<identityConfiguration>
<claimsAuthorizationManager type="ClaimsAuthorizationLibrary.MyClaimsAuthorizationManager, ClaimsAuthorizationLibrary">
<policy resource="http://localhost:28491/Developers.aspx" action="GET">
<or>
<claim claimType="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" claimValue="developer" />
<claim claimType="http://schemas.xmlsoap.org/claims/Group" claimValue="Administrator" />
</or>
</policy>
<policy resource="http://localhost:28491/Administrators.aspx" action="GET">
<and>
<claim claimType="http://schemas.xmlsoap.org/claims/Group" claimValue="Administrator" />
<claim claimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country" claimValue="USA" />
</and>
</policy>
<policy resource="http://localhost:28491/Default.aspx" action="GET">
</policy>
<policy resource="http://localhost:28491/" action="GET">
</policy>
<policy resource="http://localhost:28491/Claims.aspx" action="GET">
</policy>
</claimsAuthorizationManager>
...
</identityConfiguration>
</system.identityModel>
...
</configuration><configuration>
<configSections>
<!--WIF 4.5 sections -->
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
...
</configSections>
...
<system.web>
<httpModules>
<!--WIF 4.5 modules -->
<!--Not needed here for IIS >= 7 -->
<!--<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>-->
</httpModules>
</system.web>
...
<system.webServer>
<modules>
<!--WIF 4.5 modules -->
<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</modules>
</system.webServer>
...
<!-- WIF 4.5 s.im section-->
<system.identityModel>
<identityConfiguration>
<claimsAuthorizationManager type="MyClaimsAuthorizationManager.SimpleClaimsAuthorizationManager, MyClaimsAuthorizationManager" />
...
</system.identityModel>
...
</configuration>
Комментарии
Класс ClaimsAuthorizationManager предоставляет базовую реализацию для диспетчера авторизации утверждений. Диспетчер авторизации утверждений можно использовать в следующих двух сценариях:
В веб-приложениях и службах диспетчер авторизации утверждений можно добавить в конвейер обработки, чтобы предоставить точку расширяемости, из которой можно авторизовать доступ к ресурсу в соответствии со значением входящих утверждений до вызова кода приложения, который фактически реализует запрошенный ресурс.
При использовании ClaimsPrincipalPermission класса или ClaimsPrincipalPermissionAttribute класса для выполнения императивных или декларативных проверок доступа на основе утверждений в коде система вызывает диспетчер авторизации утверждений, настроенный для приложения, для выполнения проверки. Проверки доступа на основе утверждений можно выполнять как в веб-приложениях, так и в классических приложениях.
Реализация по умолчанию, предоставляемая классом ClaimsAuthorizationManager , разрешает доступ для каждого представленного утверждения. Однако вы можете наследоваться от этого класса и переопределить CheckAccess метод, чтобы предоставить собственную логику авторизации.
Использование диспетчера авторизации утверждений является необязательным. Вы можете настроить приложение для использования диспетчера авторизации утверждений программным способом с помощью IdentityConfiguration класса или декларативно, указав <элемент claimsAuthorizationManager> , который является дочерним элементом <элемента identityConfiguration> в файле конфигурации приложения. Если приложение является веб-сайтом или веб-приложением, размещенным в службах IIS, необходимо также добавить ClaimsAuthorizationModule в коллекцию ASP.NET HTTP Modules.
Важно!
При использовании ClaimsPrincipalPermission класса или класса диспетчер авторизации утверждений ClaimsPrincipalPermissionAttribute , используемый для выполнения проверки доступа, указывается в конфигурации удостоверения в свойстве FederatedAuthentication.FederationConfiguration . В файле конфигурации это <identityConfiguration>
раздел, на который ссылается элемент по умолчанию <federationConfiguration>
. Это верно даже для служб Windows Communication Foundation (WCF) и классических приложений.
Базовый ClaimsAuthorizationManager класс не принимает дополнительную конфигурацию; однако можно переопределить LoadCustomConfiguration в производных классах, чтобы обеспечить инициализацию диспетчера авторизации утверждений из дочерних <claimsAuthorizationElement>
элементов . Типичный сценарий заключается в использовании этих дочерних элементов для указания политик авторизации, которые определяют, какие типы и значения утверждений необходимы для получения доступа к какому ресурсу. Это не является жестким требованием, хотя вы можете определить любое использование и синтаксис, которые имеют смысл для вашей реализации.
Конструкторы
ClaimsAuthorizationManager() |
Инициализирует новый экземпляр класса ClaimsAuthorizationManager. |
Методы
CheckAccess(AuthorizationContext) |
При реализации в производном классе проверяет авторизацию для субъекта в указанном контексте, чтобы выполнить заданное действие в указанном ресурсе. |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
LoadCustomConfiguration(XmlNodeList) |
При переопределении в производном классе загружает пользовательскую конфигурацию из XML-кода. |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |