一、过滤器

过滤器(Filter)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,并不是每个请求都会响应内容,只有那些有特定权限的用户才能响应特定的内容。过滤器理论上有以下功能:

  1. 判断登录与否或者用户权限。
  2. 决策输出缓存。
  3. 防盗链。
  4. 防蜘蛛。
  5. 本地化与国际化设置。
  6. 实现动态Action(做权限管理系统经常用到)。

1、使用方式一

第一种方法是在Controller或Action上面直接使用Authorize特性,不设置特性的任何属性。看下面的截图:

从上面的截图中可以看出:第一个名为Index的Action方法是没有过滤的,任何身份的请求都可以通过。只需要在浏览器的URL地址栏里面输入:http://localhost:**/Admin/Index就能得到对应的视图响应,效果如下:

而第二个名为Welcome的Action方法上面使用了Authorize特性,表示这是一个只处理那些通过身份验证的URL的请求,页面请求效果如下:

这时可以看到报错了:提示只有通过身份验证的用户才能访问请求所需的资源。

这种报错页面很不友好,一般这种情况都是跳转到登录页面让用户进行登录,所以对程序进行如下的改造。

1.1、添加登录页面

新建Account控制器,并新建两个Action方法,代码如下:

using MVCAuthorizeFilterDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security; namespace MVCAuthorizeFilterDemo.Controllers
{
public class AccountController : Controller
{
// GET: Account
public ActionResult Index()
{
return View();
} /// <summary>
/// 显示登录视图
/// </summary>
/// <returns></returns>
public ActionResult LogOn()
{
LogOnViewModel model = new LogOnViewModel();
return View(model); } /// <summary>
/// 处理用户点击登录提交回发的表单
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public ActionResult LogOn(LogOnViewModel model)
{
//只要输入的用户名和密码一样就过
if (model.UserName.Trim() == model.Password.Trim())
{
// 判断是否勾选了记住我
if (model.RememberMe)
{
//2880分钟有效期的cookie
FormsAuthentication.SetAuthCookie(model.UserName, true);
}
else
{
//会话cookie
FormsAuthentication.SetAuthCookie(model.UserName, false);
}
// 跳转到Account控制器的Welcome方法
return RedirectToAction("Welcome", "Admin");
}
else
{
return View(model);
} }
}
}

LogOnViewModel是用户登录实体类,定义如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web; namespace MVCAuthorizeFilterDemo.Models
{
// <summary>
/// 用户登录实体类
/// </summary>
public class LogOnViewModel
{
/// <summary>
/// 用户名
/// </summary>
[DisplayName("用户名")]
public string UserName { get; set; } /// <summary>
/// 密码
/// </summary>
[DisplayName("密码")]
public string Password { get; set; } /// <summary>
/// 记住我
/// </summary>
[DisplayName("记住我")]
public bool RememberMe { get; set; } }
}

LogOn视图页代码如下:

@model MVCAuthorizeFilterDemo.Models.LogOnViewModel
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>LogOn</title>
</head>
<body>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken() <div class="form-horizontal">
<h4>登录</h4>
<hr />
@Html.ValidationSummary(true) <div class="form-group">
@Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
</div> <div class="form-group">
@Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
</div> <div class="form-group">
@Html.LabelFor(model => model.RememberMe, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.RememberMe)
@Html.ValidationMessageFor(model => model.RememberMe)
</div>
</div> <div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="登录" class="btn btn-default" />
</div>
</div>
</div>
}
</body>
</html>

1.2、修改配置文件

在上面的案例中,如果权限认证没有通过会显示错误页面,这种情况下要跳转到登录页面让用户进行登录,所以要再配置文件里面配置登录页面,如果没有通过身份认证就会跳转到配置文件里面配置的登录页面,配置文件代码如下:

<!--配置登录页面-->
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>

1.3、测试

改造完以后重新生成,在URL地址栏里面输入:http://localhost:39175/Admin/Index,页面显示效果如下:

在访问Welcome方法,输入:http://localhost:39175/Admin/Welcome,页面显示效果如下:

从上图中可以看出虽然访问的是Welcome这个Action,但是并没有直接返回相应的视图,而是被带到了登录页面,这是因为Welcome这个Action上面使用了Authorize特性,拒绝了所有未登录用户的访问。

上面既然拒绝了未验证用户的访问,那么就登录下通过验证。看上面LogOn里面的代码就知道,只要输入的用户名和密码相同就可以登录,都输入“admin”,这时页面显示如下:

截图表明已经通过验证并且得到了Welcome这个Action的相应。按F12打开控制台,会发现这时多了一个名为“.ASPXAUTH”的Cookie,这个是默认名称,在配置文件里面可以修改。如果登录的时候勾选了记住我,那么此Cookie的过期时间就是在配置文件里面定义的2880分钟。

2、使用方式二

权限过滤器的第二种用法:基于用户授权和基于角色授权。

基于角色授权就是给Authorize特性的Roles属性赋值,多个角色可以使用逗号分隔。基于用户授权就是给Authorize特性的Users属性赋值,如果是多个用户也可以使用逗号分隔。验证不通过时也可以通过web.config进行配置。

继续基于上面的案例进行改造,只允许登录名为“a”、“b”的两个用户可以访问Welcome方法,改造后的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MVCAuthorizeFilterDemo.Controllers
{
public class AdminController : Controller
{
// GET: Admin
public ActionResult Index()
{
return View();
} /// <summary>
/// 使用方式一:直接使用Authorize特性,特性不添加任何属性
/// </summary>
/// <returns></returns>
//[Authorize]
//public ActionResult Welcome()
//{
// return View();
//} /// <summary>
/// 使用方式二:使用Authorize特性,添加Users属性,只能a、b登录用户才可以访问
/// </summary>
/// <returns></returns>
[Authorize(Users ="a,b")]
public ActionResult Welcome()
{
return View();
}
}
}

再次访问http://localhost:39175/Admin/Welcome,然后用admin登录,这时会发现页面不会跳转到Welcome方法对应的页面,还是显示登录页。如果换成a或者b登录就会显示Welcome对应的页面了,这说明设置的Users属性起作用了。

在上面的案例中,给Authorize特性的Users属性赋值就可以控制可以访问的用户了,从操作性上来说这样控制Action的访问权限还是很方便的。但是如果项目很大,用户对应的角色和权限变化比较大,每次变化都要修改代码来重新标注Action显然不合适。这时该如何解决呢?这就可以用MVC提供的自定义过滤器了。下篇文章讲解自定义权限过滤器。

MVC教程:授权过滤器的更多相关文章

  1. MVC 授权过滤器 AuthorizeAttribute

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)

    授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...

  3. MVC源码分析 - Authorize授权过滤器

    从 上一篇 其实能看到, 程序执行的过滤器, 有四种 : 过滤器类型 接口 描述 Authorization IAuthorizationFilter 此类型(或过滤器)用于限制进入控制器或控制器的某 ...

  4. MVC过滤器:自定义授权过滤器

    一.授权过滤器 授权过滤器用于实现IAuthorizationFilter接口和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全策略.AuthorizeAttribute类继承了IAu ...

  5. Asp.Net MVC<五>:过滤器

    ControllerActionInvoker在执行过程中除了利用ActionDescriptor完成对目标Action方法本身的执行外,还会执行相关过滤器(Filter).过滤器采用AOP的设计,它 ...

  6. ASP.NET MVC 4 (三) 过滤器

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  7. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  8. ASP.NET MVC学习之过滤器篇(1)

    一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...

  9. ASP.NET MVC 教程汇总

    自学MVC看这里——全网最全ASP.NET MVC 教程汇总   MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...

  10. 全网最全ASP.NET MVC 教程汇总

    全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MV ...

随机推荐

  1. js 运算的内置函数

    // 一.Math.round()作用:四舍五入返回整数.(返回参数+0.5后,向下取整) // Math.round(5.57) //返回6 // Math.round(2.4) //返回2 // ...

  2. 记一起Java大对象引起的FullGC事件及GC知识梳理

    背景 最近发生了一起 Java 大对象引起的 FullGC 事件.记录一下. 有一位商家刷单,每单内有 50+ 商品.然后进行订单导出.订单导出每次会从订单详情服务取100条订单数据.由于 100 条 ...

  3. IT兄弟连 HTML5教程 HTML5表单 HTML表单设计1

    表单是PHP程序中最常使用的收集站点访问者信息的数据输入界面.通过表单浏览器获取用户的输入数据,并传送给Web服务器的脚本程序中,以各种不同的方式进行处理.在表单中提供了多种输入方式,包括文本输入域. ...

  4. PAT 1006 Sign In and Sign Out 查找元素

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  5. 创建多进程之multiprocess包中的process模块

    创建多进程之multiprocess包中的process模块 1.process模块是一个创建进程的模块 Process([group [, target [, name [, args [, kwa ...

  6. 为什么老外不愿意用MyBatis?

    作者:陈龙 www.zhihu.com/question/309662829 Spring 团队的Josh Long自己在Twitter上做了一个调查.1625次投票,样本量不算大,但也能说明问题.和 ...

  7. 我的计划任务 --- 实现市电停电安全关闭群辉,Windows, Linux等设备

    有一次突然停电,我的群辉DS218+ 的一块硬盘出现故障了,让我担心我的数据安全,其实我是有UPS, 不是在线式的,然后就想如何实现停电自动关机呢? 经过半天的了解,其实群辉支持telnet协议,于是 ...

  8. 练手爬虫用urllib模块获取

    练手爬虫用urllib模块获取 有个人看一段python2的代码有很多错误 import re import urllib def getHtml(url): page = urllib.urlope ...

  9. 用两种以上的 方式实现一个方法或者对象,调用时打印"你好xx",已定义的代码不能做修改,自己编译的不能出现"你好"? (Javasctript)

    先上代码 const obj = { say(){ Array.from(arguments).forEach(item=>{ console.log(`${this.str} ${item}` ...

  10. HBuilderx 模拟器调试设置

    模拟器名称    连接默认端口夜神安卓模拟器夜神安卓模拟器     62001逍遥安卓模拟器逍遥安卓模拟器     21503BlueStacks(蓝叠安卓模拟器)BlueStacks(蓝叠安卓模拟器 ...