zoukankan      html  css  js  c++  java
  • 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都可以自动选择的.呵呵.

  • 相关阅读:
    熟悉常用的HDFS操作
    爬虫爬取小说网站
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    综合练习:词频统计
    最近在学习多元分析,有空放上来分享
    机器学习基石作业一15-20题(Python实现)
    2018十月份
  • 原文地址:https://www.cnblogs.com/lori/p/2519177.html
Copyright © 2011-2022 走看看