Поделиться через


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 модулей HTTP ASP.NET.

Это важно

При использовании 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)

Применяется к