Sdílet prostřednictvím


ClaimsAuthorizationManager Třída

Definice

Definuje základní implementaci pro správce autorizace deklarací identity.

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
Dědičnost
ClaimsAuthorizationManager
Implementuje

Příklady

Příklady kódu, které se používají v ClaimsAuthorizationManager tématech, jsou převzaty z ukázky Claims Based Authorization . Tato ukázka poskytuje vlastního správce autorizace deklarací identity, který může autorizovat předměty na základě zásad zadaných v konfiguraci. Vlastní správce autorizace deklarací identity se skládá ze tří základních komponent: třídy odvozené od ClaimsAuthorizationManager třídy, která implementuje správce, ResourceAction třídy, která spáruje prostředek a akci, a čtečky zásad, která čte a kompiluje zásady zadané v konfiguračním souboru. Tuto kompilovanou zásadu pak může použít správce autorizace deklarací identity k vyhodnocení objektu zabezpečení za účelem autorizace přístupu k prostředkům. Ne všechny prvky se zobrazují kvůli stručnosti. Informace o této ukázce a dalších ukázkách dostupných pro technologii WIF a o tom, kde je stáhnout, najdete v tématu Index vzorového kódu WIF.

Následující kód ukazuje implementaci vlastního správce autorizace deklarací identity. Metoda LoadCustomConfiguration načte a zkompiluje zásady z konfigurace pomocí pomocné třídy čtečky zásad (není zobrazena) a CheckAccess metoda udělí nebo odepře přístup na základě této zásady.

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;
        }
    }
}

Následující kód ukazuje ResourceAction třídu používanou vlastním správcem deklarací identity.

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;
        }
    }
}

Následující kód XML ukazuje, jak nakonfigurovat správce autorizace deklarací uvedený výše pro webovou aplikaci hostované ve službě IIS 7.5. Zobrazí se pouze prvky specifické pro konfiguraci správce autorizace deklarací identity. Všimněte si, že odkaz na ClaimsAuthorizationModule třídu musí být přidán do kanálu pod elementem <system.Webserver> . Pro weby a aplikace hostované ve verzích služby IIS starších než IIS 7 je možné moduly přidat do kanálu pod elementem <system.Web> . Tato konfigurace se zobrazí, ale je zakomentovaná.

Zásady používané správcem autorizace deklarací identity jsou určeny vlastními <policy> elementy v elementu <claimsAuthorizationManager> . V první zásadě musí objekt zabezpečení obsahovat jednu ze zadaných deklarací identity, aby mohl provést zadanou akci se zadaným prostředkem. Ve druhé zásadě musí objekt zabezpečení obsahovat obě deklarace identity, aby mohl provést zadanou akci se zadaným prostředkem. Ve všech ostatních se objektu zabezpečení automaticky udělí přístup bez ohledu na deklarace identity, které má.

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

Poznámky

Třída ClaimsAuthorizationManager poskytuje základní implementaci pro správce autorizace deklarací identity. Správce autorizace deklarací identity je možné použít v následujících dvou scénářích:

  • Ve webových aplikacích a službách lze do kanálu zpracování přidat správce autorizace deklarací identity, který poskytuje bod rozšiřitelnosti, ze kterého můžete autorizovat přístup k prostředku podle hodnoty příchozích deklarací identity před zavolání kódu aplikace, který skutečně implementuje požadovaný prostředek.

  • Když použijete ClaimsPrincipalPermission třídu nebo ClaimsPrincipalPermissionAttribute třídu k provádění imperativních nebo deklarativních kontrol přístupu na základě deklarací identity ve vašem kódu, systém zavolá správce autorizace deklarací identity, který je nakonfigurován pro vaši aplikaci, aby provedl kontrolu. Kontroly přístupu na základě deklarací identity je možné provádět ve webových i desktopových aplikacích.

Výchozí implementace poskytovaná ClaimsAuthorizationManager třídou autorizuje přístup pro každou prezentovanou deklaraci identity. Z této třídy však můžete odvodit a přepsat metodu CheckAccess a poskytnout tak vlastní autorizační logiku.

Použití správce autorizace deklarací identity je volitelné. Aplikaci můžete nakonfigurovat tak, aby používala správce autorizace deklarací identity buď programově pomocí IdentityConfiguration třídy, nebo deklarativně zadáním elementu <claimsAuthorizationManager> , který je podřízeným prvkem <elementu identityConfiguration> v konfiguračním souboru aplikace. Pokud je vaše aplikace web nebo webová aplikace hostovaná v Internetové informační službě (IIS), musíte také přidat ClaimsAuthorizationModule do kolekce ASP.NET HTTP Modules.

Důležité

Pokud použijete ClaimsPrincipalPermission třídu nebo ClaimsPrincipalPermissionAttribute třídu , správce autorizace deklarací identity, který se používá k provedení kontroly přístupu, je ten, který je zadaný v konfiguraci identity v rámci FederatedAuthentication.FederationConfiguration vlastnosti . V konfiguračním souboru je <identityConfiguration> to oddíl, na který odkazuje výchozí <federationConfiguration> element. To platí i pro služby WCF (Windows Communication Foundation) a desktopové aplikace.

Základní ClaimsAuthorizationManager třída nemá žádnou další konfiguraci. Můžete však přepsat LoadCustomConfiguration v odvozených třídách a zajistit inicializaci správce autorizace deklarací identity z podřízených prvků objektu <claimsAuthorizationElement>. Typickým scénářem je použití těchto podřízených prvků k určení zásad autorizace, které určují, které typy a hodnoty deklarací identity se vyžadují k získání přístupu ke kterému prostředku. Nejedná se o náročný požadavek, i když můžete definovat jakékoli použití a syntaxi, které mají pro vaši implementaci smysl.

Konstruktory

ClaimsAuthorizationManager()

Inicializuje novou instanci ClaimsAuthorizationManager třídy .

Metody

CheckAccess(AuthorizationContext)

Při implementaci v odvozené třídě kontroluje autorizaci pro předmět v zadaném kontextu k provedení zadané akce se zadaným prostředkem.

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
LoadCustomConfiguration(XmlNodeList)

Při přepsání v odvozené třídě načte vlastní konfiguraci z XML.

MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro