一个系统,用户身份认证少不了,ASP.NET Core提供完整的解决方案Identity,用户创建和维护登录名;也提供能cookie和JwtBearer认证方案,当然你可以使用第三方认证Oauth、openId。项目没有采用前后端分离,是一个标准的mvc项目,所以本文采用系统提供的cookie认证 记录一下简单认证流程,(1)使用用户账号密码进行登录,验证合法登录(2)确认合法身份之后,会颁发一个认证票据(加密)会携带与该用户相关的身份、权限以及其他信息。(3)退出。

主要会使用Microsoft.AspNetCore.Authentication.Abstractions包中 AuthenticationHttpContextExtensions类,它是基于HttpContext上公开身认证的扩展法:

方法 描述
SignInAsync 登录用户.用户登录成功后颁发一个证书(加密的用户凭证,这个凭证放入Cookie中),用来标识用户的身份
SignOutAsync 注销退出.清除Cookie
GetTokenAsync 用来获取 AuthenticationProperties 中保存的额外信息
ForbidAsync 通知用户权限不足,如果是ajax请求返回403状态码,不是ajax请求跳转指定的url
ChallengeAsync 通知用户需要登录。在默认实现类AuthenticationHandler中,返回401
AuthenticateAsync 验证在 SignInAsync 中颁发的证书,并返回一个 AuthenticateResult 对象,表示用户的身份。

登录创建一个cookie认证

这里涉及几个对象:Claim声明常常代表,认证用户身份的元数据信息,比如手机号、邮箱、用户名等等。ClaimsIdentity声明主体,代表一个认证用户的身份证,当然包含声明的集合。ClaimsPrincipal身份证持有者。

流程:创建一个包含用户信息的 cookie需要构造一个ClaimsPrincipal。将序列化用户信息并将其存储在中 cookie 。

用必要的 Claim来构造一个ClaimsIdentity,然后调用 SignInAsync 来登录用户。

  public async Task<Result> UserLogin([FromForm] UserLoginInput input){//登录逻辑var model = userService.UserLogin(input);//1.创建cookie 保存用户信息,使用claim。将序列化用户信息并将其存储在cookie中var claims = new List<Claim>(){new Claim(ClaimTypes.MobilePhone,model.Mobile),new Claim(ClaimTypes.Name,model.UserName),new Claim("Id",model.SysNo.ToString())};//2.创建声明主题 指定认证方式 这里使用cookievar claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);//3.配置认证属性 比如过期时间,是否持久化。。。。var authProperties = new AuthenticationProperties{//AllowRefresh = <bool>,// Refreshing the authentication session should be allowed.//ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),// The time at which the authentication ticket expires. A// value set here overrides the ExpireTimeSpan option of// CookieAuthenticationOptions set with AddCookie.//IsPersistent = true,//持久化 ,比如 登录的时候 勾选记住我 复选框//IssuedUtc = <DateTimeOffset>,//绝对cookie过期//RedirectUri = <string>// The full path or absolute URI to be used as an http// redirect response value.};//4.登录await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);return Result.ResponseSuccess();}

SignInAsync 创建一个加密的 cookie ,并将其添加到当前响应中。

退出

退出很简单,主要用户清除cookie

HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

获取认证信息

登录之后,我们通常会获取一些声明中的信息,可以使用 HttpContext.User 将会返回一个ClaimsPrincipal对象

            ClaimsPrincipal principal = HttpContext.User;if (null != principal){foreach (Claim claim in principal.Claims){var ii = "CLAIM TYPE: " + claim.Type + "; CLAIM VALUE: " + claim.Value + "</br>";}}

统一处理获取到的信息,赋值UserViewModel实例CurrentLoginUser

  public class BaseController : Controller{public UserViewModel CurrentLoginUser{get{var principal = HttpContext.User;if (principal != null){return new UserViewModel(){UserName = principal.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value,Mobile = principal.Claims.FirstOrDefault(x => x.Type == ClaimTypes.MobilePhone)?.Value,SysNo = new Guid(principal.Claims.FirstOrDefault(x => x.Type == "Id")?.Value ?? Guid.Empty.ToString())};}return null;}}

使用

      var userId = CurrentLoginUser.SysNo;

startup类配置

在ConfigureServices方法添加

              services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>{options.LoginPath =new PathString("/User/Login");});

在Configure方法添加

            application.UseAuthentication();application.UseAuthorization();

参考:

https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/cookie?view=aspnetcore-3.1

.NET core3.1使用cookie进行身份认证相关推荐

  1. 身份认证 Session认证机制 Cookie原理

    身份认证 什么是身份认证 身份认证又称"身份验证"."鉴权",是指通过一定的手段,完成对用户身份的确认. 日常生活中的身份认证随处可见,例如:高铁的验票乘车,手 ...

  2. 细说ASP.NET Forms身份认证

    细说ASP.NET Forms身份认证 阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 ...

  3. 【前端——Node.js】:身份认证

    一.前后端身份认证 1.web开发者模式 (1)服务端渲染的Web开发模式  (2)前后端分离的web开发模式 选择: 2.身份认证 身份认证:又称身份验证.鉴权,是指通过一定的手段,完成对用户的身份 ...

  4. Node.js 学习之数据库与身份认证

    数据库与身份认证 文章目录 数据库与身份认证 1.SQL 的相关学习 1. SQL 的概念 2. SQL 语句学习 a. 查询数据(select).插入数据(insert into).更新数据(upd ...

  5. node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制

    node.js学习总结 什么是node.js node.js的内置模块 fs系统模块 path路径模块 http模块 模块化 npm与包 express express路由 express+mysql ...

  6. 四、Node.js - 数据库与身份认证

    文章目录 目标 一.数据库的基本概念 1.什么是数据库 2.常见的数据库及分类 3.传统型数据库的数据组织结构 (1)Excel 的数据组织结构 (2)传统型数据库的数据组织结构 (3)实际开发中库. ...

  7. 数据库与身份认证 - 04

    文章目录 1. 数据库的基本概念 1.1 什么是数据库 1.2 常见的数据库及分类 1.3 传统型数据库的数据组织结构 1. Excel 的数据组织结构 2. 传统型数据库的数据组织结构 3. 实际开 ...

  8. Kali扫描 w3af的使用(一)用户界面和身份认证

    Kali--WEB渗透(六) 学习web渗透过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流. -- 扫描:w3af(一)-- 本篇博客主要介绍w3af的用户界面和身份认证方 ...

  9. 数据库与身份认证——黑马课程笔记

    数据库与身份认证 1.数据库的基本概念 2.安装并配置MySQL 3.MySQL的基本使用 3.1使用MySQL workbench管理数据库 1.连接数据库 2.了解主界面的组成部分 3.创建数据库 ...

最新文章

  1. java构造方法基础_Java 基础:构造方法
  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
  3. java string类型_java中String类型
  4. menuconfig和Kconfig、.config的关系
  5. 17秋 软件工程 团队第五次作业 Alpha Scrum9
  6. wordpress php 链接,WordPress中获取页面链接和标题的相关PHP函数用法解析
  7. 为什么在idea没有preview_设计学研究的idea从哪里来?
  8. (四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子
  9. 【经验心得】每刷新一次页面就顺序更换一张图片的js特效
  10. linux 权限 代码,linux 管理权限(示例代码)
  11. 卡巴斯基KEY大集合
  12. php数据库 datetime转化时间错,分析php日期转时间戳
  13. 微信小程序(十二)uni-app框架开发及组件库
  14. altium room 布局_Altium Designer的PCB中ROOM的功用、放置、修改
  15. Linux+C 开发基础
  16. JAVA练习 家庭记账本
  17. 跨境电商如何解决供应链物流效率、交付等重点问题
  18. MySQL中Innodb的聚簇索引和非聚簇索引
  19. Scyther工具形式化分析Woo-Lam协议
  20. ChatGPT将引发大量而普遍的网络安全隐患

热门文章

  1. LeetCode139:Word Break
  2. Appium同时运行多个设备
  3. andriod之应用内置浏览器 webview
  4. diy感应usb摄像头拍照_DIY无线感应充电器
  5. keep-alive使用_如何使用Google Keep进行无忧笔记
  6. t-mobile频段_T-Mobile再次被黑客入侵:超过200万个帐号和地址可能泄漏
  7. 用window.location.href实现页面跳转
  8. 搭建 vue2 单元测试环境(karma+mocha+webpack3)
  9. 学号20145209《信息安全系统设计基础》第11周学习总结
  10. 使用Visual Studio 创建可视Web Part部件