.NET Core使用Cookie做身份验证
市面上见的比较多的认证协议是JWT这种颁布令牌(Access Token)的方式,同样也诞生出了OAuth2这种第三方授权框架,但是我们不要忽视了最原始的cookie认证方式,本次博客就来回顾一下这个存在了20年(不知道是不是20年,想想看,我们世界上最好的语言C#才诞生20年)依旧经久不衰的原始存在。
本文使用的是.NET Core 6.0。
1、添加 cookie 身份验证
创建一个CookieAuthentication的.NET Core Web API 的项目,引用
Microsoft.AspNetCore.Authentication.Cookies
将身份验证中间件服务 AddAuthentication 添加到和 AddCookie 方法。
using Microsoft.AspNetCore.Authentication.Cookies;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
//builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
// .AddCookie();//添加身份验证中间件服务 AddAuthentication ,并使用AddCookie 方法注入cookie
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>{options.ExpireTimeSpan = TimeSpan.FromMinutes(20);options.SlidingExpiration = true;options.AccessDeniedPath = null;});builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}
//添加认证(认证需要在Map方法调用前写,否则无效)
app.UseAuthentication();
//授权
app.UseAuthorization();app.MapControllers();app.Run();
2、 创建、验证、注销cookie
新建控制器UserAuthenticationController,编写用户登录、验证、注销cookie三个方法
[Route("User/[controller]/[Action]")][ApiController]public class UserAuthenticationController : ControllerBase{/// <summary>/// 认证/// </summary>/// <param name="number"></param>/// <param name="passwd"></param>/// <returns></returns>[AllowAnonymous][HttpPost]public async Task<IActionResult> UserSignInAsync(string number, string passwd){//这里无数据库,默认admin,123456为登录成功用户名及密码,role为adminif (number=="admin"&&passwd=="123456"){var user = new { Name = "张三", Email = "666@qq.com", Role = "admin" };var claims = new List<Claim>{new Claim(ClaimTypes.Name, user.Name),new Claim(ClaimTypes.Email,user.Email),new Claim(ClaimTypes.Role, user.Role)};//通过Claim来创建ClaimsIdentity 类似于通过用户的身份来创建身份证var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);var authProperties = new AuthenticationProperties{//应该允许刷新身份验证会话。AllowRefresh = true,//身份验证票证过期的时间10分钟ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),//允许持久化IsPersistent = true,//cookie过期时间1天IssuedUtc = DateTime.Now.AddDays(1),//重定向url地址RedirectUri=""};//授权cookieawait HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);return Ok(new{code = 200,messgae = $"用户{user.Name}登录成功,登录时间{ DateTime.UtcNow}"});}return Ok(new{code = 404,messgae = $"用户信息错误"});}/// <summary>/// 获取用户信息/// </summary>/// <returns></returns>//[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)][HttpGet]public IActionResult GetUser(){//if (HttpContext.User.Identity!=null){if (HttpContext.User.Identity.IsAuthenticated) //判断用户是否通过认证{string name = HttpContext.User.Claims.ToList()[0].Value;return Ok(new{code = 200,messgae = $"当前用户是{name}"});}else{return Ok(new{code = 400,messgae = "未登录"});}}return Ok(new{code = 400,messgae = "无权访问"});}/// <summary>/// 注销/// </summary>/// <param name="returnUrl"></param>/// <returns></returns>[HttpPost]public async Task<IActionResult> UserSignOutAsync(){await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);return Ok(new{code = 200,messgae = "注销成功"});}}
2、 验证cookie授权
.NET 6 默认集成了OpenAPI (Swagger),我们只需要运气起来,就会看到如下界面
首先用浏览器请求登录接口,返回如下:
请求获取用户,返回如下:
接下来,用postman,直接请求获取用户的接口,返回如下:
查看cookie,显示【No cookies yet】
此时,再再postman登录一次,再请求接口,返回信息如下
当调用注销之后,cookie即消失
有时候,为了更加安全,不登录用户,未获取cookie的用户,将无法正常使用api,此时,此时,只需要再对应的API增加特性即可
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
此时未授权的用户,直接返回404
代码请参阅:点击查看
.NET Core使用Cookie做身份验证相关推荐
- ASP.NET的MVC中使用Cookie做身份验证(附代码下载)
场景 ASP.NET的MVC中使用Session做身份验证(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1071 ...
- 问题分享:最近测试VDI-in-a-Box使用AD做身份验证出现以下错误提示:
原文出处:http://vdi.so/blog/?p=4488 问题分享:最近测试VDI-in-a-Box使用AD做身份验证出现以下错误提示: 错误信息: Notification: Could no ...
- FreeRADIUS整合微软活动目录做身份验证时报错“winbind client not authorized to use winbindd_pam_auth_crap”的解决方法
FreeRADIUS使用微软活动目录做身份验证时,当客户端发起认证请求到radius服务器时,radius服务器报错"winbind client not authorized to use ...
- ASP.NET Core 项目简单实现身份验证及鉴权
环境 VS 2017 ASP.NET Core 2.2 目标 以相对简单优雅的方式实现用户身份验证和鉴权,解决以下两个问题: 无状态的身份验证服务,使用请求头附加访问令牌,几乎适用于手机.网页.桌面应 ...
- WCF消息拦截,利用消息拦截做身份验证服务
本文参考 http://blog.csdn.net/tcjiaan/article/details/8274493 博客而写 添加对信息处理的类 /// <summary>/// 消息 ...
- ASP.NET的MVC中使用Session做身份验证(附代码下载)
场景 ASP.NET中MVC编程模式简介与搭建HelloWorld项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10679 ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
目录 介绍 JWT(JSON Web令牌) ASP.NET Core中的JWToken配置 用户模型类 创建令牌 第1步 第2步 第4步 令牌存储 中间件 自定义中间件app.Use() 中间件app ...
- .NET Core 3.0中的Cookie身份验证
目录 介绍 先决条件 创建Web应用程序的步骤 集成Cookie身份验证 Startup.cs文件的代码更改 将User.cs文件添加到Model文件夹 使用新的操作方法更新HomeControlle ...
- 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...
最新文章
- this指向undefined uiapp_JavaScript深入之史上最全5种this绑定全面解析
- python程序员收入-python收入
- 取代现有电商和实体店菜市场的新模式
- Linux软件安装的补充
- 多线程编程有什么用途_为什么建议你一定要学懂C++
- [Xcode 实际操作]七、文件与数据-(3)创建文本文件、属性列表文件、图片文件
- 对Web设计和开发人员有用的15个Chrome插件
- Linux学习:第一天,
- 五一档票房超8.8亿元!张艺谋新片仅第二
- 求你别自己瞎写工具类了,Spring自带的这些他不香吗?
- Nmap内网扫描端口
- 软件设计师备考全攻略(附本人笔记)
- 微信小程序如何搭建自己的后台(超详细,超完整)(上线必备)!!!
- 日志级别的选择:Debug、Info、Warn、Error还是Fatal
- python实现——处理Excel表格(超详细)
- java 线程阻止_Java:在特定队列大小后阻止提交的ExecutorService
- CF115B Lawnmower(贪心)
- 使用软件搭建RAID10
- 百度网盘安装在c盘显示系统权限限制的解决方法
- java架构设计图,不止面试题,笔记源码统统都有
热门文章
- 软件维护人员及运维人员岗位职责
- 明星直播的品牌效应,这几个关键数据你一定要知道!
- 智能指纹锁迎来大风口,能否在三年内成为大众消费品?
- TF Live 直播回放丨Frank Wu:当OpenStack遇到Tungsten Fabric
- [007]嵌入式学习:模数转换器-ADC
- javaee.jar与servlet-api.jar
- pandas 错误提醒:FutureWarning: elementwise comparison failed;
- 深度缓冲中的深度值计算及可视化
- 鸿蒙灵儿宠物奔驰法拉利,鄂P66666,从奔驰换成法拉利,车主还有限量版劳斯莱斯,中国只有三台...
- js word 预览_Node.js微服务实践(二)