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 方法以提供你自己的授权逻辑。
声明授权管理器的使用是可选的。 可以通过使用 类或声明方式将应用程序配置为使用IdentityConfiguration声明授权管理器,方法是指定 <claimsAuthorizationManager> 元素,该元素是应用程序配置文件中的 identityConfiguration> 元素的<子元素。 如果应用程序是托管在 Internet Information Services (IIS) 中的网站或 Web 应用程序,则还必须 ClaimsAuthorizationModule 在 ASP.NET HTTP Modules 集合中添加 。
重要
使用 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) |