加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

利用EntLib授权机制实现对ASP.NET页面的自动授权

发布时间:2020-12-16 09:08:12 所属栏目:asp.Net 来源:网络整理
导读:ASP.NET默认采用UrlAuthorizationModule和FileAuthorizationModule分别实现针对请求地址和物理文件的授权,但是在很多情况下我们需要额外的授权方式。Entlib提供了一种基于表达式的授权方式,它允许我们以一个表达式的方式来定义授权的规则。在新的项目中我

ASP.NET默认采用UrlAuthorizationModule和FileAuthorizationModule分别实现针对请求地址和物理文件的授权,但是在很多情况下我们需要额外的授权方式。Entlib提供了一种基于表达式的授权方式,它允许我们以一个表达式的方式来定义授权的规则。在新的项目中我们希望利用EntLib的授权框架来实现针对ASP.NET页面的自动授权,本文描述的解决方案是我刚刚想到的,希望广大网友朋友们帮助评估一下。[源代码从这里下载]

目录
一、实例演示
二、AuthorizationFilterAttribute
三、AuthorizeAttribute
四、PageBase

一、实例演示

我们先来作一个简单的实例演示。如下所示的EntLib安全模块的配置,如果读者对此不了解也没有关系,在这里我们只需要关注定义其中的一个授权规则(Authorization Rule):“I:Foo OR R:Admin”。这是一个逻辑表达式,前缀I:和R:分别表示用户名(Identity)和角色(Role),整个表达式表示的授权逻辑是:“帐号为Foo的用户和所有具有Admin角色的用户”有权限方法与此表达式关联的操作或者资源。配置还定义了该授权规则的名称“FooOrAdmin”。

   1: <configuration>
   3:     section name="securityConfiguration" 
   5:                    Microsoft.Practices.EnterpriseLibrary.Security"/>
  10:            ="Microsoft.Practices.EnterpriseLibrary.Security.AuthorizationRuleProvider,1)" id="lnum11">  11:                  Microsoft.Practices.EnterpriseLibrary.Security"  12:         rules  13:           expression="I:Foo OR R:Admin" ="FooOrAdmin"   14:           15:       add  16:       17:   securityConfiguration  18: >

我们添加一个需要授权的Web页面(Default.aspx),并且使用上面定义的表达式来作为该页面的授权规则,我们通过自定义的AuthorizeAttribute特性实现两者之间的关联(该特性构造函数中指定的字符串正是配置的授权规则名称)。除此之外,Web页面对应的类型继承自我们自定义的基类PageBase。

   2: public partial class Default : PageBase
   4: }

我们随后添加一个登录页面,具体的实现就不再这里一一介绍了。为了模拟不同的登录用户具有不同的权限,我们通过注册HttpApplication的AuthenticateRequest事件来对当前Principal进行定制。具体的定义如下所示:如果用户名为Bar,我们让当前的Principal具有Admin角色,对于其他帐号的登录用户,角色列表为空。

2: {
   4:     {
   6:         {
   8:         }
  10:         IIdentity identity = new GenericIdentity(HttpContext.Current.User.Identity.Name);
if (identity.Name.ToLower() == "bar")
  14:             roles = new string[] { "Admin" };
  16:         HttpContext.Current.User = new GenericPrincipal(identity,roles);
  18: }

由于页面Default.aspx与配置名称为FooOrAdmin的授权规则进行了关联,根绝授权规则表达式定义和针对不同用户的角色列表,意味着当我们以账户Foo和Bar登录后才能访问该页面,“自动化授权”可以通过下图得到证实:当前用户为Foo和Bar时,页面得以正常显示;而当我们以Baz的身份登录后,显示“Access denied…”。

二、AuthorizationFilterAttribute

这里我吸取了ASP.NET MVC基于AuthorizationFilter的授权方式,不同的是AuthorizationFilter在ASP.NET MVC中以特性的方式应用到Controller类型和Action方法上,这里我们则将它应用到Web页面对应的类上。AuthorizationFilterAttribute作为授权筛选器特性的基类定义如下,由于多个特性可以同时应用到同一个类型上,它们的执行顺序通过属性Order来控制。具体的授权判断以及对非授权请求的处理定义在方法OnAuthorization方法上。

abstract class AuthorizationFilterAttribute:Attribute
   4:     int Order { get; set; }
   6: }
   8: class AuthorizationContext
  10:     public HttpContext  HttpContext { get; private set; }
  12:? 
  14:     {
  16:     }
class AuthorizeAttribute : AuthorizationFilterAttribute
   6:     {
   8:         this.AuthorizationRule = authorizationRule;
  10:? 
  12:     {
if (authorizationProvider.Authorize(context.HttpContext.User,1)">this.AuthorizationRule))
  16:             return true;
  18:         this.HandleUnauthorizedRequest(context);
  20:     }
  22:     virtual void HandleUnauthorizedRequest(AuthorizationContext context)
  24:         context.HttpContext.Response.Write(context.HttpContext.User.Identity.Name + ": Access denied...");
  26: }

四、PageBase

我们知道针对一个ASP.NET 资源的请求最后大都通过一个对应的HttpHandler来处理,这个授权解决方案的基本思路就是通过自定义HttpHandler实现自动化授权检验。Page类型是我们最为熟悉的HttpHandler,为此我们定义了如下一个继承自它的类型PageBase。如下面的代码片断所示,在重写的ProcessRequest方法中实现了对应用在当前类型上的AuthorizationFilterAttribute特性的解析和执行,进而提供了对授权的实现。

void ProcessRequest(HttpContext context)
   6:                                 .OfType<AuthorizationFilterAttribute>()
   8:         AuthorizationContext authorizationContext = new AuthorizationContext(context);
  10:         foreach (AuthorizationFilterAttribute attribute in filterAttributes)
  12:             isAuthorized = attribute.OnAuthorization(authorizationContext);
  14:             {
  16:             }
if (isAuthorized)
  21:             base.ProcessRequest(context);
  23:     }