详解ASP.NET MVC Form表单验证

2019-05-22 20:58:31于丽

一、前言

  关于表单验证,已经有不少的文章,相信Web开发人员也都基本写过,最近在一个个人项目中刚好用到,在这里与大家分享一下。本来想从用户注册开始写起,但发现东西比较多,涉及到界面、前端验证、前端加密、后台解密、用户密码Hash、权限验证等等,文章写起来可能会很长,所以这里主要介绍的是登录验证和权限控制部分,有兴趣的朋友欢迎一起交流。

  一般验证方式有Windows验证和表单验证,web项目用得更多的是表单验证。原理很简单,简单地说就是利用浏览器的cookie,将验证令牌存储在客户端浏览器上,cookie每次会随请求发送到服务器,服务器验证这个令牌。通常一个系统的用户会分为多种角色:匿名用户、普通用户和管理员;这里面又可以再细分,例如用户可以是普通用户或Vip用户,管理员可以是普通管理员或超级管理员等。在项目中,我们有的页面可能只允许管理员查看,有的只允许登录用户查看,这就是角色区分(Roles);某些特别情况下,有些页面可能只允许叫“张三”名字的人查看,这就是用户区分(Users)。

  我们先看一下最后要实现的效果:

1.这是在Action级别的控制。

public class Home1Controller : Controller
{
  //匿名访问
  public ActionResult Index()
  {
    return View();
  }
  //登录用户访问
  [RequestAuthorize]
  public ActionResult Index2()
  {
    return View();
  }
  //登录用户,张三才能访问
  [RequestAuthorize(Users="张三")]
  public ActionResult Index3()
  {
    return View();
  }
  //管理员访问
  [RequestAuthorize(Roles="Admin")]
  public ActionResult Index4()
  {
    return View();
  }
}

2.这是在Controller级别的控制。当然,如果某个Action需要匿名访问,也是允许的,因为控制级别上,Action优先级大于Controller。

//Controller级别的权限控制
[RequestAuthorize(User="张三")]
public class Home2Controller : Controller
{
  //登录用户访问
  public ActionResult Index()
  {
    return View();
  }
  //允许匿名访问
  [AllowAnonymous]
  public ActionResult Index2()
  {
    return View();
  }
}

3.Area级别的控制。有时候我们会把一些模块做成分区,当然这里也可以在Area的Controller和Action进行标记。

  从上面可以看到,我们需要在各个地方进行标记权限,如果把Roles和Users硬写在程序中,不是很好的做法。我希望能更简单一点,在配置文件进行说明。例如如下配置:

<?xml version="1.0" encoding="utf-8" ?>
<!--
  1.这里可以把权限控制转移到配置文件,这样就不用在程序中写roles和users了
  2.如果程序也写了,那么将覆盖配置文件的。
  3.action级别的优先级 > controller级别 > Area级别  
-->
<root>
 <!--area级别-->
 <area name="Admin">
  <roles>Admin</roles>
 </area>
  
 <!--controller级别-->
 <controller name="Home2">
  <user>张三</user>
 </controller>
  
 <!--action级别-->
 <controller name="Home1">
  <action name="Inde3">
   <users>张三</users>
  </action>
  <action name="Index4">
   <roles>Admin</roles>
  </action>
 </controller>
</root>