.NET core3.1使用cookie进行身份认证
一个系统,用户身份认证少不了,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进行身份认证相关推荐
- 身份认证 Session认证机制 Cookie原理
身份认证 什么是身份认证 身份认证又称"身份验证"."鉴权",是指通过一定的手段,完成对用户身份的确认. 日常生活中的身份认证随处可见,例如:高铁的验票乘车,手 ...
- 细说ASP.NET Forms身份认证
细说ASP.NET Forms身份认证 阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 ...
- 【前端——Node.js】:身份认证
一.前后端身份认证 1.web开发者模式 (1)服务端渲染的Web开发模式 (2)前后端分离的web开发模式 选择: 2.身份认证 身份认证:又称身份验证.鉴权,是指通过一定的手段,完成对用户的身份 ...
- Node.js 学习之数据库与身份认证
数据库与身份认证 文章目录 数据库与身份认证 1.SQL 的相关学习 1. SQL 的概念 2. SQL 语句学习 a. 查询数据(select).插入数据(insert into).更新数据(upd ...
- node.js学习总结:node.js的内置模块,模块化,npm与包 express,前后端身份认证 JWT认证机制
node.js学习总结 什么是node.js node.js的内置模块 fs系统模块 path路径模块 http模块 模块化 npm与包 express express路由 express+mysql ...
- 四、Node.js - 数据库与身份认证
文章目录 目标 一.数据库的基本概念 1.什么是数据库 2.常见的数据库及分类 3.传统型数据库的数据组织结构 (1)Excel 的数据组织结构 (2)传统型数据库的数据组织结构 (3)实际开发中库. ...
- 数据库与身份认证 - 04
文章目录 1. 数据库的基本概念 1.1 什么是数据库 1.2 常见的数据库及分类 1.3 传统型数据库的数据组织结构 1. Excel 的数据组织结构 2. 传统型数据库的数据组织结构 3. 实际开 ...
- Kali扫描 w3af的使用(一)用户界面和身份认证
Kali--WEB渗透(六) 学习web渗透过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流. -- 扫描:w3af(一)-- 本篇博客主要介绍w3af的用户界面和身份认证方 ...
- 数据库与身份认证——黑马课程笔记
数据库与身份认证 1.数据库的基本概念 2.安装并配置MySQL 3.MySQL的基本使用 3.1使用MySQL workbench管理数据库 1.连接数据库 2.了解主界面的组成部分 3.创建数据库 ...
最新文章
- java构造方法基础_Java 基础:构造方法
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
- java string类型_java中String类型
- menuconfig和Kconfig、.config的关系
- 17秋 软件工程 团队第五次作业 Alpha Scrum9
- wordpress php 链接,WordPress中获取页面链接和标题的相关PHP函数用法解析
- 为什么在idea没有preview_设计学研究的idea从哪里来?
- (四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子
- 【经验心得】每刷新一次页面就顺序更换一张图片的js特效
- linux 权限 代码,linux 管理权限(示例代码)
- 卡巴斯基KEY大集合
- php数据库 datetime转化时间错,分析php日期转时间戳
- 微信小程序(十二)uni-app框架开发及组件库
- altium room 布局_Altium Designer的PCB中ROOM的功用、放置、修改
- Linux+C 开发基础
- JAVA练习 家庭记账本
- 跨境电商如何解决供应链物流效率、交付等重点问题
- MySQL中Innodb的聚簇索引和非聚簇索引
- Scyther工具形式化分析Woo-Lam协议
- ChatGPT将引发大量而普遍的网络安全隐患
热门文章
- LeetCode139:Word Break
- Appium同时运行多个设备
- andriod之应用内置浏览器 webview
- diy感应usb摄像头拍照_DIY无线感应充电器
- keep-alive使用_如何使用Google Keep进行无忧笔记
- t-mobile频段_T-Mobile再次被黑客入侵:超过200万个帐号和地址可能泄漏
- 用window.location.href实现页面跳转
- 搭建 vue2 单元测试环境(karma+mocha+webpack3)
- 学号20145209《信息安全系统设计基础》第11周学习总结
- 使用Visual Studio 创建可视Web Part部件