MVC中使用AuthorizeAttribute做身份验证操作

代码顺序为:OnAuthorization-->AuthorizeCore-->HandleUnauthorizedRequest

如果AuthorizeCore返回false时,才会走HandleUnauthorizedRequest 方法,并且Request.StausCode会返回401,401错误又对应了Web.config中的:

<authentication mode="Forms">
     <forms loginUrl="~/" timeout="2880" />
</authentication>

所有,AuthorizeCore==false 时,会跳转到 web.config 中定义的  loginUrl="~/"

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public class CheckLoginAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
         bool Pass = false;
         if (!CheckLogin.AdminLoginCheck())
         {
             httpContext.Response.StatusCode = 401;//无权限状态码
             Pass = false;
         }
         else
         {
             Pass = true;
         }
         return Pass;
     }     protected override void OnAuthorization(AuthorizationContext filterContext)     {         base.OnAuthorization(filterContext);     }
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
     {
         base.HandleUnauthorizedRequest(filterContext);
         if (filterContext.HttpContext.Response.StatusCode == 401)
         {
             filterContext.Result = new RedirectResult("/");
         }
     } }  

AuthorizeAttribute的OnAuthorization方法内部调用了AuthorizeCore方法,这个方法是实现验证和授权逻辑的地方,如果这个方法返回true,表示授权成功,如果返回false, 表示授权失败, 会给上下文设置一个HttpUnauthorizedResult,这个ActionResult执行的结果是向浏览器返回一个401状态码(未授权),但是返回状态码没什么意思,通常是跳转到一个登录页面,可以重写AuthorizeAttribute的HandleUnauthorizedRequest

protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
    if (context == null)
    {
        throw new ArgumentNullException("filterContext");
    }
     else
    {
        string path = context.HttpContext.Request.Path;
        string strUrl = "/Account/LogOn?returnUrl={0}";  

        context.HttpContext.Response.Redirect(string.Format(strUrl, HttpUtility.UrlEncode(path)), true);
    }
}
时间: 2024-12-31 03:49:26

MVC中使用AuthorizeAttribute做身份验证操作的相关文章

详解Angular开发中的登陆与身份验证

前言 由于 Angular 是单页应用,会在一开始,就把大部分的资源加载到浏览器中,所以就更需要注意验证的时机,并保证只有通过了验证的用户才能看到对应的界面. 本篇文章中的身份验证,指的是如何确定用户是否已经登陆,并确保在每次与服务器的通信中,都能够满足服务器的验证需求.注意,并不包括对具体是否具有某一个权限的判断. 对于登陆,主要是接受用户的用户名密码输入,提交到服务器进行验证,处理验证响应,在浏览器端构建身份验证数据. 实现身份验证的两种方式 目前,实现身份验证的方法,主要有两个大类: Co

ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

原文:ASP.NET没有魔法--ASP.NET MVC使用Oauth2.0实现身份验证 随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的形式开放给第三方的,身份验证这一功能已经演化为一个服务,很多大型应用中都有自己的身份验证服务器甚至集群,所以普通的身份验证方式已经不能满足需求. 在.Net领域中也有一些开源的身份验证服务器组件,如Identit

ASP.NET MVC中对Model进行分步验证的解决方法

原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的.当时很纠结,因为刚接触Asp.net

在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client

在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client 阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你以很简单的方式在在PHP应用中集成OAuth2.0身份验证. 用法 验证代码流程 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 4

ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐述那么多页面不可能都去一个个手动处理.其实MVC很牛逼的地方就是把Attribute利用的非常完美,接下来就来看下它是如何做到的吧! 第一步.我们要定义一个登录过滤标签-LoginFilterAttribute并且继承AuthorizeAttribute.来看下它内部是啥样子 1 // Summar

在ASP.NET Core 2.0中使用Facebook进行身份验证

已经很久没有更新自己的技术博客了,自从上个月末来到天津之后把家安顿好,这个月月初开始找工作,由于以前是做.NET开发的,所以找的还是.NET工作,但是天津这边大多还是针对to B(企业)进行定制开发的,一是技术框架已经成型了,招收几个会CRUD的就好,二是小企业众多,给不了太多的钱,老板们大多比较关心这个程序员的工作年限,什么技术的不怎么关心.所以找工作一直碰壁,有看中的直接说我们给不了这么多,你如果要这个数可以考虑什么的.so,我就直接没考虑.一是钱少,二是技术垃圾,学不到什么东西. 所以前几

BootStrap--Tables(表格) MVC中不刷新做增,删,改(C#)

自带的Tables会有自动分页,搜索等一些动能,很方便,唯一的不足就是添加,修改,删除数据需要刷新页面,并不能静态. 下面说的是如何不刷新页面(Ajax)去执行增,删,改操作. 需要用到的样式,JS库(需要自己去复制到自己的项目中) @*bootstrap 样式*@ <link href="~/Content/css/bootstrap.css" rel="stylesheet" /> @*datatable 样式*@ <link rel=&quo

mvc中服务器端、客户端属性验证

在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证: 我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解进行解析,实现前端.后端的数据验证: HtmlHelper.数据注解在其他文章中再详细介绍,本文主要介绍如何使数据验证发生作用. 下面分别介绍两种验证方式: 一.服务器端验证 要实现服务器端的验证非常简单,只需要满足下面三个条件: ①有数据注解 ②页面部分使用HtmlHelper生成各种表单元素 使用这些html标签的时候,需要引用

在Laravel中使用Middleware进行身份验证

新建一个中间件: 方法写在handle中 判断用户是否登录而且是否是管理员,不是的话返回到主页 新建判断是否为管理员的方法 在kernel定义一个中间件,key是admin 注册群组路由:prefix是路由前缀,访问路由会自动在前面加上路由前缀:middleware是key值,会去验证中间件 1在数据库中是管理员 成功 附: 注册单个路由的中间件: Route::get('admin/profile', ['middleware' => 'auth', function () { // }]);