关于.net中的身份认证(AuthorizeAttribute)的问题
引言
新公司当初面试的时候问了我很多用户验证的问题,这里就把我的对于验证的想法写一下,希望可以有一个系统的学习记录。
一、如何验证
B/S结构的请求是http请求,个人理解的http请求有两个特点:1、无状态 2、短连接 (下篇文章会说一下我个人对于http连接的想法)。所以一个请求是否是我们系统的用户我们一般是用Session和Cookie来判断的。请求又可以分为两种,一种是页面的请求,一种是数据API的ajax请求。所以一个判断请求是否是系统用户可以这么写
public void HasLogin(HttpContextBase httpContext)
{
//判断用户登录信息是否存在,这里是用Session,有的用Cookie(加密)
if (httpContext.Session["UserInfo"] == null)
{
//如果是AJAX的API请求
if (httpContext.Request.IsAjaxRequest())
{
//这边处理错误API请求反馈,一般是反馈错误提示
}
else
{
//这边是页面请求,如果是未登录的话直接跳转到登录页面
}
}
}
二、如何使用
有了验证的逻辑之后就可以通过重写.net自己的AuthorizeAttribute类来实现用户身份验证了。AuthorizeAttribute类有两个重要的方法:AuthorizeCore和HandleUnauthorizedRequest。其中AuthorizeCore函数是用来判断一个请求是否通过用户验证,它的返回结果是一个bool。HandleUnauthorizedRequest函数则是在AuthorizeCore返回结果是false时会调用的函数。源代码如下所示

从图中可以看出当AuthorizeCore函数结果为false时,就会触发HandleUnauthorizedRequest函数来处理验证失败。所以我们可以自定义一个AuthorizeAttribute类的子类并重写上面的两个方法。
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.Session["UserInfo"] == null)
{
return false;
}
return true;
} protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
//如果是Ajax请求
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new
{
ResultCode = ResultCode.Exception,
ResultMess = "请求用户未登录!"
}
};
}
else
{
//处理Url请求
//验证不通过,直接跳转到相应页面,注意:如果不使用以下跳转,则会继续执行Action方法
filterContext.Result = new RedirectResult("/Home/Index");
}
}
三、添加AuthorizeAttribute过滤
我们自定义个AthorizeAttribute已经实现了,接下来就是在控制器上面实现了。具体实现方法有三种
1、Controller层级添加

2、Action层级添加

3、全局添加

(这个过滤器配置可以在Global.asax中看到)
四、取消过滤
有些页面,例如登录页面、登录请求的时候用户是肯定还没有登录的,这个时候如果我用了全局添加的话,用户岂不是永远无法登录了?那么为了使某些特定的方法可以不用验证过滤可以在特定Action、Controller上面添加以下抬头
AllowAonymous表示一个特性,该特性用于标记在授权期间要跳过 System.Web.Mvc.AuthorizeAttribute 的控制器和操作
总结
由于本人也是才疏学浅,改文章也是为了记录学习。如果文中有不足或者错误之处还请大家指出。谢谢
关于.net中的身份认证(AuthorizeAttribute)的问题的更多相关文章
- Asp-Net-Core学习笔记:身份认证入门
前言 过年前我又来更新了~ 我就说了最近不是在偷懒吧,其实这段时间还是有积累一些东西的,不过还没去整理-- 所以只能发以前没写完的一些笔记出来 就当做是温习一下啦 PS:之前说的红包封面我还没搞,得抓 ...
- 项目开发-->身份认证及用户登录模块
1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...
- Delphi实现WebService带身份认证的数据传输
WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台.跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨 ...
- 构建具有用户身份认证的 Ionic 应用
序言:本文主要介绍了使用 Ionic 和 Cordova 开发混合应用时如何添加用户身份认证.教程简易,对于 Ionic 入门学习有一定帮助.因为文章是去年发表,所以教程内关于 Okta 的一些使用步 ...
- 【Shiro】Apache Shiro架构之身份认证(Authentication)
Shiro系列文章: [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shiro ...
- java web项目war包部署,使用tomcat对指定接口设置身份认证
先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
- 理解ASP.NET Core - 基于Cookie的身份认证(Authentication)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 通常,身份认证(Authentication)和授权(Authorization)都会放 ...
- 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证
注:下载本文提到的完整代码示例请访问:How to authorization Angular 2 app with asp.net core web api 在ASP.NET Core中使用Angu ...
随机推荐
- kvm初体验之九:vm创建快照
1. 准备一个磁盘格式为qcow2的vm(raw格式的磁盘无法创建快照) 方法一:从头安装一个磁盘格式为qcow2的vm [root@tanghuimin vm]# qemu-img create - ...
- php 数组分页
$p = max(1, I('param.p',1,'intval')); $count = count($date); $Page = new Page($count,15); $Page-> ...
- 序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})
package com.dsj.gdbd.utils.serialize; import java.io.ByteArrayInputStream; import java.io.ByteArrayO ...
- 利用Hibernate 框架,实现对数据库的增删改查
增: package com.maya.test; import org.hibernate.*; import org.hibernate.cfg.*; import com.maya.model. ...
- 2.4 AppDelegate 的 3 个生命周期
Classed/AppDelegate.cpp 文件内容如下: #include "cocos2d.h" #include "CCEGLView.h" #inc ...
- Debian for ARM install python 3.5.x
/********************************************************************************** * Debian for ARM ...
- BZOJ4009:[HNOI2015]接水果
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- 机器学习:scikit-learn中算法的调用、封装并使用自己所写的算法
一.scikit-learn库中的kNN算法 scikit-learn库中,所有机器学习算法都是以面向对象的形式进行包装的: 所有scikit-learn库中机器学习算法的使用过程:调用.实例化.fi ...
- web攻击之九:其它
四.身份认证和会话 [攻击] 黑客在浏览器中停用JS,防止客户端校验,从而进行某些操作. [防御] 1.隐藏敏感信息. 2.对敏感信息进行加密. 3.session 定期失效 五.权限与访问控制 [攻 ...
- ZAB与Paxos算法的联系与区别
ZAB协议并不是Paxos算法的一个典型实现,在讲解ZAB和Paxos之间的区别之前,我们首先来看下两者的联系. 两者都存在一个类似于Leader进程的角色,由其负责协调多个Follow进程的运行. ...