快速业务通道

联合身份标识:使用WIF实现ASP.NET被动身份验证

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
之外,还可以使用 PrincipalPermission 类型写入传统的基于角色的权限要求。还可以使用所要求的角色声明(第二个构造函数参数)初始化该类型,当调用 Demand 时,将调用当前主体的 IsInRole 方法。如果找不到该声明,则引发异常:

PrincipalPermission p = 
  new PrincipalPermission("", "Administrators");
p.Demand();

如果要在相应角色不存在时拒绝请求并引发异常,此方法很有用。

集中处理所有被请求资源的通用权限检查也是很有用的。有时,如果有访问控制策略(如存储在数据库中的规则),则可以使用中心组件读取这些规则,从而控制对特性和功能的访问。为此,WIF 提供了一个可以扩展的 ClaimsAuthorizationManager 组件。我以前的文章中提到过,您可以在身份标识模型节配置这种自定义组件类型:

<microsoft.identityModel>
  <service>
   <!--other settings-->
   <claimsAuthorizationManager 
    type="CustomClaimsAuthorizationManager"/>
  </service>
</microsoft.identityModel>

图 7 演示一个自定义的 ClaimsAuthorizationManager,它验证名称声明是否存在,AdminsOnly 目录内的被请求资源是否需要 Administrators 角色声明。

图 7 自定义 ClaimsAuthorizationManager 实现

public class CustomClaimsAuthorizationManager:
  ClaimsAuthorizationManager {

  public CustomClaimsAuthorizationManager()
  { }

  public override bool CheckAccess(
   AuthorizationContext context) {

   ClaimsIdentity claimsIdentity = 
    context.Principal.Identity as ClaimsIdentity;
   if (claimsIdentity.Claims.Where(
    x => x.ClaimType == ClaimTypes.Name).Count() <= 0)
    throw new SecurityException("Access is denied.");

   IEnumerable<Claim> resourceClaims = 
    context.Resource.Where(x=>x.ClaimType==ClaimTypes.Name);
   if (resourceClaims.Count() > 0) {
    foreach (Claim c in resourceClaims) {
     if (c.Value.Contains("\AdminOnly") &&
      !context.Principal.IsInRole("Administrators"))
      throw new SecurityException("Access is denied.");
    }
   }

   return true;
  }
}

CustomClaimsAuthorizationManager 通过重写 CheckAccess 实现这一功能。此方法提供一个 AuthorizationContext 参数,该参数提供有关如下内容的信息:请求操作(对于被动联合来说,是 HTTP 谓词,如 GET 或 POST)、请求的资源(一个 URI)和尚未附加到请求线程的 ClaimsPrincipal。

声明转换

通常,IP-STS 发出的声明对描述经过身份验证的用户是有用的,但与 RP 的授权要求无关。IdP 的任务不是了解每个 RP 的授权需要哪种类型的角色、权限或其他更细粒度的项, 而是授权给身份标识提供程序域有关的声明,或 IdP 可针对经过身份验证的用户断言的声明。

因此,RP 可能需要将声明从 IP-STS 转换为与授权更加相关的项。这表明 RP 可以将用户标识映射(可能按用户名称或 UPN)到 RP 声明集。假设 IP-STS 授权给默认角色声明,图 8 列出了 RP 按照每个传入角色声明发出的可能权限声明集。权限声明类型可以是 RP 定义的自定义声明类型,如:

urn:ClaimsAwareWebSite/2010/01/claims/permission

自定义 ClaimsAuthenticationManager 很适合转换传入 IP-STS 声明。将以下代码添加到 microsoft.identityModel 节,可

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号