ClaimsAuthorizationManager Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menentukan implementasi dasar untuk manajer otorisasi klaim.
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
- Warisan
-
ClaimsAuthorizationManager
- 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 keringkasan. Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tentang tempat mengunduhnya, lihat Indeks Sampel Kode WIF.
Kode berikut menunjukkan implementasi manajer otorisasi klaim kustom. Metode ini LoadCustomConfiguration membaca dan mengkompilasi kebijakan dari konfigurasi dengan menggunakan kelas pembantu pembaca kebijakan (tidak ditampilkan) dan CheckAccess metode memberikan atau menolak akses berdasarkan kebijakan ini.
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;
}
}
}
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;
}
}
}
XML berikut menunjukkan cara mengonfigurasi manajer otorisasi klaim yang ditunjukkan di atas untuk aplikasi web yang dihosting di IIS 7.5. Hanya elemen khusus untuk konfigurasi manajer otorisasi klaim yang ditampilkan. Perhatikan bahwa referensi ke ClaimsAuthorizationModule kelas harus ditambahkan ke alur di <system.Webserver>
bawah elemen . Untuk situs dan aplikasi yang dihosting dalam versi IIS sebelum IIS 7, modul dapat ditambahkan ke alur di bawah <system.Web>
elemen . Konfigurasi ini ditampilkan tetapi dikomentari.
Kebijakan yang digunakan oleh manajer otorisasi klaim ditentukan oleh elemen kustom <policy>
di bawah <elemen claimsAuthorizationManager> . 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. Dalam semua yang lain, prinsipal secara otomatis diberikan akses terlepas dari klaim yang dimilikinya.
<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>
Keterangan
Kelas ini ClaimsAuthorizationManager menyediakan implementasi dasar untuk manajer otorisasi klaim. Manajer otorisasi klaim dapat digunakan dalam dua skenario berikut:
Dalam aplikasi dan layanan berbasis web, manajer otorisasi klaim dapat ditambahkan ke alur pemrosesan untuk memberikan titik ekstensibilitas tempat Anda dapat mengotorisasi akses ke sumber daya sesuai dengan nilai klaim masuk sebelum kode aplikasi yang benar-benar mengimplementasikan sumber daya yang diminta dipanggil.
Saat Anda menggunakan ClaimsPrincipalPermission kelas atau ClaimsPrincipalPermissionAttribute kelas untuk melakukan pemeriksaan akses berbasis klaim imperatif atau deklaratif dalam kode Anda, manajer otorisasi klaim yang dikonfigurasi untuk aplikasi Anda dipanggil oleh sistem untuk melakukan pemeriksaan. Pemeriksaan akses berbasis klaim dapat dilakukan di aplikasi berbasis web dan aplikasi desktop.
Implementasi default yang disediakan oleh ClaimsAuthorizationManager kelas mengotorisasi akses untuk setiap klaim yang disajikan; namun, Anda dapat memperoleh dari kelas ini dan mengambil CheckAccess alih metode untuk memberikan logika otorisasi Anda sendiri.
Penggunaan manajer otorisasi klaim bersifat opsional. Anda dapat mengonfigurasi aplikasi untuk menggunakan manajer otorisasi klaim baik secara terprogram dengan menggunakan IdentityConfiguration kelas atau secara deklaratif, dengan menentukan <elemen claimsAuthorizationManager> , yang merupakan elemen turunan dari <elemen identityConfiguration> dalam file konfigurasi aplikasi Anda. Jika aplikasi Anda adalah situs web atau aplikasi web yang dihosting di Internet Information Services (IIS), Anda juga harus menambahkan ClaimsAuthorizationModule dalam kumpulan Modul HTTP ASP.NET.
Penting
Saat Anda menggunakan ClaimsPrincipalPermission kelas atau ClaimsPrincipalPermissionAttribute kelas , manajer otorisasi klaim yang digunakan untuk melakukan pemeriksaan akses adalah yang ditentukan dalam konfigurasi identitas di bawah FederatedAuthentication.FederationConfiguration properti . Dalam file konfigurasi, ini adalah <identityConfiguration>
bagian yang dirujuk dari elemen default <federationConfiguration>
. Ini berlaku bahkan untuk layanan Windows Communication Foundation (WCF) dan aplikasi desktop.
Kelas ClaimsAuthorizationManager dasar tidak mengambil konfigurasi tambahan; namun, Anda dapat mengambil LoadCustomConfiguration alih kelas turunan untuk memberikan inisialisasi manajer otorisasi klaim Anda dari elemen anak dari <claimsAuthorizationElement>
. Skenario umumnya adalah menggunakan elemen anak ini untuk menentukan kebijakan otorisasi yang menentukan jenis dan nilai klaim mana yang diperlukan untuk mendapatkan akses ke sumber daya mana. Ini bukan persyaratan yang sulit, meskipun Anda bebas untuk menentukan penggunaan dan sintaks apa pun yang masuk akal untuk implementasi Anda.
Konstruktor
ClaimsAuthorizationManager() |
Menginisialisasi instans baru kelas ClaimsAuthorizationManager. |
Metode
CheckAccess(AuthorizationContext) |
Saat diimplementasikan di kelas turunan, memeriksa otorisasi untuk subjek dalam konteks yang ditentukan untuk melakukan tindakan yang ditentukan pada sumber daya yang ditentukan. |
Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
GetHashCode() |
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
GetType() |
Mendapatkan dari instans Type saat ini. (Diperoleh dari Object) |
LoadCustomConfiguration(XmlNodeList) |
Saat ditimpa di kelas turunan, memuat konfigurasi kustom dari XML. |
MemberwiseClone() |
Membuat salinan dangkal dari saat ini Object. (Diperoleh dari Object) |
ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |