引言

    新公司当初面试的时候问了我很多用户验证的问题,这里就把我的对于验证的想法写一下,希望可以有一个系统的学习记录。

  一、如何验证

    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)的问题的更多相关文章

  1. Asp-Net-Core学习笔记:身份认证入门

    前言 过年前我又来更新了~ 我就说了最近不是在偷懒吧,其实这段时间还是有积累一些东西的,不过还没去整理-- 所以只能发以前没写完的一些笔记出来 就当做是温习一下啦 PS:之前说的红包封面我还没搞,得抓 ...

  2. 项目开发-->身份认证及用户登录模块

    1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...

  3. Delphi实现WebService带身份认证的数据传输

    WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台.跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨 ...

  4. 构建具有用户身份认证的 Ionic 应用

    序言:本文主要介绍了使用 Ionic 和 Cordova 开发混合应用时如何添加用户身份认证.教程简易,对于 Ionic 入门学习有一定帮助.因为文章是去年发表,所以教程内关于 Okta 的一些使用步 ...

  5. 【Shiro】Apache Shiro架构之身份认证(Authentication)

    Shiro系列文章: [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shiro ...

  6. java web项目war包部署,使用tomcat对指定接口设置身份认证

    先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...

  7. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

    上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...

  8. 理解ASP.NET Core - 基于Cookie的身份认证(Authentication)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 通常,身份认证(Authentication)和授权(Authorization)都会放 ...

  9. 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证

    注:下载本文提到的完整代码示例请访问:How to authorization Angular 2 app with asp.net core web api 在ASP.NET Core中使用Angu ...

随机推荐

  1. Java -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类

    1. 成员内部类分为  静态内部类 和 非静态内部类. 非静态内部类 和 外部类的其他成员一样处理, 非静态内部类可以访问外部类的private的属性,而外部类不能访问非静态内部类的属性,需要实例非静 ...

  2. android 真心话大冒险 摇色子

    android 真心话大冒险  摇色子 软件

  3. Hadoop- MR的shuffle过程

    step1 input InputFormat读取数据,将数据转换成<key ,value>对,设置FileInputFormat,默认是文本格式(TextInputFormat) ste ...

  4. ubantu16.04

    http://mirror.pnl.gov/releases/xenial/ ubuntu16.04下载地址: 中科大源       http://mirrors.ustc.edu.cn/ubuntu ...

  5. python第五篇:Linux上将txt导入mysql

    昨天写小项目的时候遇到了一个需求:把txt文档的数据导入到mysql数据库中,开始本来想直接用Mysql Workbench导入TXT文件,但是最后发现不支持TXT导入,结果我吧嗒吧嗒的去把TXT转了 ...

  6. DoTween插件

    doteeen(hotween第二个版本) hotween leantween gokit itween(多个相同动画类型的插件):性能最高的是dotween 引用命名空间:using DG.Twee ...

  7. spring自动扫描装配bean

    applicationContext.xml: <!-- 自动扫描service包,根据包中注解自动装配bean --> <context:component-scan base-p ...

  8. C++(三)— 二维容器

    1.二维bool向量 vector<vector<bool>> dp(len, vector<bool>(len, false));

  9. Hibernate学习---第七节:关联关系

    一.关联关系一对一外键(双向) 1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: ...

  10. csv+jenkins+ant测试接口

    1.文件目录 jmeter_test case 用于存放case,csv或者txt格式,jmeter能读取的 result_log 用于存放报告 html 存放html报告 jtl 存放jtl文件 s ...