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


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)

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