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 的 Web 應用程式設定上述宣告授權管理員。 只會顯示宣告授權管理員組態特有的專案。 請注意,類別的 ClaimsAuthorizationModule 參考必須新增至 專案下的 <system.Webserver> 管線。 針對 IIS 7 之前裝載于 IIS 版本的網站和應用程式,模組可以新增至 元素下的 <system.Web> 管線。 此組態會顯示,但已批註化。

宣告授權管理員所使用的原則是由claimsAuthorizationManager > 元素下的 <自訂 <policy> 元素所指定。 在第一個原則中,主體必須擁有其中一個指定的宣告,才能對指定的資源執行指定的動作。 在第二個原則中,主體必須擁有這兩個宣告,才能對指定的資源執行指定的動作。 在所有其他情況下,不論主體擁有的宣告為何,都會自動授與存取權。

<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 提供宣告授權管理員的基底實作。 宣告授權管理員可用於下列兩種案例:

  • 在 Web 型應用程式和服務中,宣告授權管理員可以新增至處理管線,以提供擴充點,您可以在實際實作要求資源的應用程式程式碼呼叫之前,根據傳入宣告的值來授權存取資源。

  • 當您使用 ClaimsPrincipalPermission 類別或 ClaimsPrincipalPermissionAttribute 類別在程式碼中執行命令式或宣告式宣告式存取檢查時,系統會呼叫系統為應用程式設定的宣告授權管理員來執行檢查。 宣告型存取檢查可以在 Web 應用程式和傳統型應用程式中執行。

類別所提供的 ClaimsAuthorizationManager 預設實作會授權每個呈現之宣告的存取權;不過,您可以衍生自這個類別,並覆寫 CheckAccess 方法以提供您自己的授權邏輯。

宣告授權管理員的使用是選擇性的。 您可以藉由在應用程式組態檔中指定< claimsAuthorizationManager >元素<>,將應用程式設定為以程式設計方式使用 IdentityConfiguration 宣告授權管理員。 如果您的應用程式是裝載于 Internet Information Services (IIS) 的網站或 Web 應用程式,您也必須在 ASP.NET HTTP Modules 集合中新增 ClaimsAuthorizationModule

重要

當您使用 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)

適用於