一、什么是身份验证和授权

  人们有时对用户身份验证和用户授权之间的区别感到疑惑。用户身份验证是指通过某种形式的登录机制(包括用户名/密码、OpenID、OAuth等说明身份的项)来核实用户的身份。授权验证是用来核实登录站点的用户是否在他们所具有的权限内执行操作,这通常使用一些基于角色或者基于声明的系统来实现。

二、AuthorizeAttribute的使用

  1、MVC5只要将属性[Authorize]置于相关的action之前就行,那么在调用Buy action之前,就会运用Authorize过滤器。

[Authorize]
public ActionResult Index(int id)
{
//其它相关逻辑代码放在这里 }

  2、MVC5将属性[Authorize]置于整个Controller之上。这样位于此控制器下的所有action就都运用了此过滤器。

[Authorize]
public class HomeController:Controller
{
public active Index
{ }
//其他action
}

  3、MVC5将Authorize应用到全部的应用程序的范围内,要使AuthorizeAttribute成为全局过滤器,只要将其加入全局过滤器集合RegisterGlobalFilters方法。

  对于大部分网站而言,基本上整个应用程序都需要身份验证,当然我们不可能在每个控制器上添加Authorize特性。此时,把AuthorizeAttribute配置为全局过滤器,并使用AllowAnonymous特性来允许匿名访问某些控制器或方法。修改App_Start/FilterConfig.cs文件中的RegisterGlobalFilters方法:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizeAttribute());
filters.Add(new HandleErrorAttribute());
}

  (1)注意,在LoginController中的Login方法,系统已经帮我们添加了AllowAnonymous特性,不然是无法正常登陆的。

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
return View();
}

  (2)全局控制器的应用只适用于MVC的Controller和Action,对于Web Forms,静态页面,和其它的HTTP handlers 都不适用。

三、重写(扩展)授权过滤器

  扩展授权过滤器可以定义继承自AuthorizeAttribute的类,也可以定义同时继承自FilterAttribute, IAuthorizationFilter接口的类。 

  //预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。  
  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
     //重写时,提供一个入口点用于进行自定义授权检查
// 返回结果: 如果用户已经过授权,则为 true;否则为 false。
// 异常:System.ArgumentNullException:httpContext 参数为 null。
protected virtual bool AuthorizeCore(HttpContextBase httpContext); //处理未能授权的 HTTP 请求。
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext); //在过程请求授权时调用。
// 异常: System.ArgumentNullException:
//filterContext 参数为 null。
public virtual void OnAuthorization(AuthorizationContext filterContext); }

AuthorizeAttribute提供了三个可重新的虚方法AuthorizeCore,HandleUnauthorizedRequest,OnAuthorization,那么在执行授权动作的过程中他们是如何被调用的呢?看下源码的OnAuthorization方法,发现在这个方法中先调用AuthorizeCore,然后调用HandleUnauthorizedRequest被调用了。

     public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
} //如果子操作的缓存处于活动状态,那么就抛出异常
if (OutputCacheAttribute.IsChildActionCacheActive(filterContext))
{
throw new InvalidOperationException(MvcResources.AuthorizeAttribute_CannotUseWithinChildActionCache);
} //判断控制器或控制器操作是否允许匿名访问,如果可以就return
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true); if (skipAuthorization)
{
return;
} //进行权限验证
if (AuthorizeCore(filterContext.HttpContext))
{
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan());
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
else
{//处理未通过权限验证的情形
HandleUnauthorizedRequest(filterContext);
}
}

源码下载https://github.com/qiuxianhu/SimpleLoginAuthorization

ASP.NET MVC5学习系列——身份验证、授权的更多相关文章

  1. ASP.NET MVC5 学习系列之初探MVC

    一.由问题看本质 (一)什么是MVC? MVC是Model-View-Controller的简称.它是在1970年引入的软件设计模式.MVC 模式强迫关注分离 — 域模型和控制器逻辑与UI是松耦合关系 ...

  2. ASP.NET MVC5 学习系列之模型绑定

    一.理解 Model Binding Model Binding(模型绑定) 是 HTTP 请求和 Action 方法之间的桥梁,它根据 Action 方法中的 Model 类型创建 .NET 对象, ...

  3. ASP.NET MVC5 学习系列之表单和HTML辅助方法

    一.表单 (一)Action和Method特性 Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址.这里的Url地址可以是相对的,也可以是绝对的.如下Form ...

  4. ASP.NET MVC5 学习系列之视图

    一.视图约定 当创建一个项目模版时,可以注意到,项目以一种非常具体的方式包含了一个结构化的Views目录.在每一个控制器的View文件夹中,每一个操作方法都有一个同名的视图文件与其对应.(约定大于配置 ...

  5. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  6. asp.net core 3.x 身份验证-3cookie身份验证原理

    概述 上两篇(asp.net core 3.x 身份验证-1涉及到的概念.asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份 ...

  7. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  8. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  9. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

随机推荐

  1. 华为oj之质数因子

    题目: 质数因子 热度指数:5143 时间限制:1秒 空间限制:32768K 本题知识点: 排序 题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 ...

  2. 为了学好Java,我尝试了这 6 个方法

    阅读本文大概需要 5 分钟. 教练,我想学Java! 怎么学Java,一个简单的命题,我自己也折腾了好几年,现在虽不能说是Java高手,但也算是小有所成,至少还不至于搞不懂一些基本概念和技术原理. 从 ...

  3. Typora - Markdown 语法说明

    Typora 是 Windows 下最好的 Markdown 编辑器!不接受反驳~ 导图 快捷键标题:Ctrl + 数字 Ctrl + 123456 代表 H1-H6 级标题Ctrl + 0 恢复普通 ...

  4. dnSpy 强大的.Net反编译软件

    作者:D.泡沫 一说起.net的反编译软件,大家首先想到的就是Reflector,ILSpy,dotPeek等等.而dnSpy同样是一款优秀的反编译软件,同时它是开源免费的.官方的描述是: dnSpy ...

  5. linux 制作不用密碼可立即登入的 ssh 用戶

    机器环境: 192.167.33.48 clent 用户:server 192.167.33.47 server 用户:server 1.客户端 生成密钥 ssh-keygen 2. 查看密钥文件权限 ...

  6. Redis Codis 部署安装

    背景 关于Redis的高可用除了只身的Sentinel和Cluster之外,还有一个用的比较多的是Codis,由于公司的Redis大部分都使用Codis,本文就针对Codis进行相关的安装部署进行说明 ...

  7. Request.Params

    在开发中有时会用到Request.Params["id"]来获取参数,那么到底是从什么地方接收参数呢? 一般情况下,有三种方式进行参数传递1.GET 方式,通过url传递,如?id ...

  8. Error - The debugger's worker process (msvsmon.exe) unexpectedly exited.

    Error - The debugger's worker process (msvsmon.exe) unexpectedly exited. 解决方法:Tools->Options-> ...

  9. spring boot 页面根路径获取和jsp获取的不同之处(粘贴即用)

    不同之处已做高亮. jsp 写法: <script type="text/javascript" src="${pageContext.request.contex ...

  10. [转载] spring aop 环绕通知around和其他通知的区别

    前言: spring 的环绕通知和前置通知,后置通知有着很大的区别,主要有两个重要的区别: 1) 目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,而前置和后置通知   是不能决定的,他们只 ...