共用方式為


ClaimsAuthorizationManager.LoadCustomConfiguration(XmlNodeList) 方法

定義

在衍生類別中覆寫時,從 XML 載入自訂組態。

public:
 virtual void LoadCustomConfiguration(System::Xml::XmlNodeList ^ nodelist);
public virtual void LoadCustomConfiguration (System.Xml.XmlNodeList nodelist);
abstract member LoadCustomConfiguration : System.Xml.XmlNodeList -> unit
override this.LoadCustomConfiguration : System.Xml.XmlNodeList -> unit
Public Overridable Sub LoadCustomConfiguration (nodelist As XmlNodeList)

參數

nodelist
XmlNodeList

自訂組態項目。 清單中的每個節點的型別為 XmlElement

實作

範例

主題中使用的 ClaimsAuthorizationManager 程式碼範例取自 Claims Based Authorization 範例。 此範例提供自訂宣告授權管理員,可根據組態中指定的原則來授權主體。 自訂宣告授權管理員包含三個基本元件:衍生自 ClaimsAuthorizationManager 的類別,該類別會實作管理員、 ResourceAction 配對資源與動作的類別,以及讀取和編譯組態檔中指定的原則讀取器。 宣告授權管理員接著可以使用這個編譯的原則來評估主體,以授權存取資源。 並非所有元素都是為了簡潔起見而顯示。 如需此範例和其他可供 WIF 使用之範例以及下載位置的相關資訊,請參閱 WIF 程式碼範例索引

下列程式碼顯示 方法的 LoadCustomConfiguration 覆寫。 此方法會使用 helper 原則讀取器類別 (未顯示) 來讀取和編譯組態檔中指定的授權原則。 原則會新增至字典,並由從其預定的資源和動作建立的索引鍵物件存取 ResourceAction

static Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>> _policies = new Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>>();
PolicyReader _policyReader = new PolicyReader();
/// <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;
    }
}

下列程式碼顯示 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;
        }
    }
}

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

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

備註

方法是由組 LoadCustomConfiguration 態基礎結構所呼叫。 呼叫這個方法時, nodelist 會包含組態檔中 claimsAuthorizationManager > 元素的最上層子項目 < 。 根據您為衍生類別定義的組態架構,每個元素都可以包含屬性或子項目。 如果組態檔中的 <claimsAuthorizationManager> 專案底下沒有出現任何子專案,則不會呼叫這個方法。

預設實作會擲回 NotImplementedException 。 覆寫衍生類別中的這個方法,以啟用從組態檔初始化宣告授權管理員。 一般而言,組態專案是用來表示授權原則;不過,您可以根據應用程式的需求,定義元素並使用它們的任何方式。

適用於