Attribute有啥用~MVC中标准的用户登陆验证

你是否需要对一个页面进行登陆或其它权限的验证,你的作法是怎样的,可能在以前的程序开发中,会使用

if .... else  这样的条件判断,遍布在你的程序代码中,而对于.net的程序员来说,有一个福音,那不是Attribute,即"特性"

它的出现,改变了代码设计方式,你再也不需要到处都有的if else了,你只要把它写在一个自定义的Attribute里就可以了,其实.这也是net比其它更友好,更对程序员有吸引力的原因,也是我信仰它的原因.

过去的程序:在一个需要登陆的页面可能你要写成这样

1 if (string.IsNullOrEmpty(session("userid")))
2 
3    response.redirect("/account/logon.aspx");

 

现在的程序:

1  [UserAuthentication(AuthenticationType.BackgroundLogin)]
2     public partial class SystemController : BackgroundBaseController
3     {
4 
5       // ...
6 
7    }

 

这样,这个类下面的所有方法对应的页面都将进行登陆的验证,是否是很神奇,呵呵.

以下是用户验证特性的完整代码,供大家参考

  

 1    /// <summary>
 2     /// 用户验证列举
 3     /// </summary>
 4     public enum AuthenticationType
 5     {
 6         /// <summary>
 7         /// 登录
 8         /// </summary>
 9         Login,
10         /// <summary>
11         /// 后台登陆
12         /// </summary>
13         BackgroundLogin,
14         /// <summary>
15         /// 注册
16         /// </summary>
17         Register,
18     }
19 
20     /// <summary>
21     /// 用户验证过滤器:前台
22     /// </summary>
23     public class UserAuthentication : AuthorizeAttribute
24     {
25         public AuthenticationType Authentication { get; set; }
26         /// <summary>
27         /// 构造函数
28         /// </summary>
29         public UserAuthentication()
30             : this(AuthenticationType.Login) { }
31         public UserAuthentication(AuthenticationType authentication)
32         {
33             this.Authentication = authentication;
34         }
35         /// <summary>
36         /// 执行前验证
37         /// </summary>
38         public override void OnAuthorization(AuthorizationContext filterContext)
39         {
40 
41             //验证不成功的时候
42             switch (this.Authentication)
43             {
44                 case AuthenticationType.Login:
45                     if (!ClientHelper.Current.HasUserInfo)
46                         filterContext.Result = new RedirectResult
47 ("/Account/LogOn?returnUrl=" + HttpContext.Current.Request.Url.ToString());
48                     break;
49 
50                 case AuthenticationType.BackgroundLogin:
51                     if (string.IsNullOrEmpty(SessionAction.ReadSession("Background_Current_UserID")) || Convert.ToInt32(SessionAction.ReadSession("Background_Current_UserID")) < 0)
52                         filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { { "Action", "LogOn" }, { "Controller", "Account" }, { "returnUrl", HttpContext.Current.Request.Url.ToString() } });
53                     break;
54                 case AuthenticationType.Register:
55                     filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { { "Action", "Register" }, { "Controller", "Account" } });
56                     break;
57                 default:
58                     filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { { "Action", "Index" }, { "Controller", "Home" } });
59                     break;
60             }
61 
62         }
63     }

 

大家请注意一个地方RouteValueDictionary这个类型,可以建立一个字典对象,将你的action和controller写进去就可以组成一个完成的URL,是方法RedirectToRouteResult的作用是叫程序跳到指定的路由中去,你的路由中可以是以SHTML为扩展名,也可以是ASPX,再或者HTML都可以自动选择的.呵呵.

posted @ 2012-05-26 12:42  张占岭  阅读(3736)  评论(6编辑  收藏  举报