ClaimsAuthorizationManager.LoadCustomConfiguration(XmlNodeList) Metode

Definisi

Saat ditimpa di kelas turunan, memuat konfigurasi kustom dari 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)

Parameter

nodelist
XmlNodeList

Elemen konfigurasi kustom. Setiap simpul dalam daftar berjenis XmlElement.

Penerapan

Contoh

Contoh kode yang digunakan dalam ClaimsAuthorizationManager topik diambil dari Claims Based Authorization sampel. Sampel ini menyediakan manajer otorisasi klaim kustom yang dapat mengotorisasi subjek berdasarkan kebijakan yang ditentukan dalam konfigurasi. Manajer otorisasi klaim kustom terdiri dari tiga komponen dasar: kelas yang berasal dari ClaimsAuthorizationManager yang mengimplementasikan manajer, ResourceAction kelas yang memasangkan sumber daya dan tindakan, dan pembaca kebijakan yang membaca dan mengkompilasi kebijakan yang ditentukan dalam file konfigurasi. Kebijakan yang dikompilasi ini kemudian dapat digunakan oleh manajer otorisasi klaim untuk mengevaluasi prinsipal untuk mengotorisasi akses ke sumber daya. Tidak semua elemen ditampilkan demi brevity.

Kode berikut menunjukkan penimpaan LoadCustomConfiguration metode. Metode ini menggunakan kelas pembaca kebijakan pembantu (tidak ditampilkan) untuk membaca dan mengkompilasi kebijakan otorisasi yang ditentukan dalam file konfigurasi. Kebijakan ditambahkan ke kamus dan diakses oleh ResourceAction objek kunci yang dibuat dari sumber daya dan tindakan yang dimaksudkan.

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

Kode berikut menunjukkan kelas yang ResourceAction digunakan oleh manajer klaim kustom.

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

Kebijakan yang digunakan oleh manajer otorisasi klaim ditentukan oleh elemen kustom <policy> di <bawah elemen claimsAuthorizationManager> . Kebijakan ini dibaca dan dikompilasi LoadCustomConfiguration oleh metode . Dalam kebijakan pertama, prinsipal harus memiliki salah satu klaim yang ditentukan untuk melakukan tindakan yang ditentukan pada sumber daya yang ditentukan. Dalam kebijakan kedua, prinsipal harus memiliki kedua klaim untuk dapat melakukan tindakan yang ditentukan pada sumber daya yang ditentukan. Di semua yang lain, prinsipal secara otomatis diberikan akses terlepas dari klaim yang dimilikinya.

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

Keterangan

Metode LoadCustomConfiguration ini dipanggil oleh infrastruktur konfigurasi. Ketika metode ini dipanggil, nodelist akan berisi elemen turunan tingkat atas dari <elemen claimsAuthorizationManager> dari file konfigurasi. Masing-masing elemen ini dapat, pada gilirannya, berisi atribut atau elemen turunan tergantung pada skema konfigurasi yang Anda tentukan untuk kelas turunan Anda. Jika tidak ada elemen turunan yang <claimsAuthorizationManager> muncul di bawah elemen dalam file konfigurasi, metode ini tidak dipanggil.

Implementasi default melempar .NotImplementedException Ambil alih metode ini di kelas turunan Anda untuk mengaktifkan inisialisasi manajer otorisasi klaim Anda dari file konfigurasi. Biasanya, elemen konfigurasi digunakan untuk mengekspresikan kebijakan otorisasi; namun, Anda dapat menentukan elemen dan menggunakannya dengan cara apa pun yang masuk akal berdasarkan persyaratan aplikasi Anda.

Berlaku untuk