ClaimsAuthorizationManager 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
定義宣告授權管理員的基底實作。
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) |