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都可以自动选择的.呵呵.

你可能感兴趣的:(attribute)