市面上见的比较多的认证协议是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做身份验证相关推荐

  1. ASP.NET的MVC中使用Cookie做身份验证(附代码下载)

    场景 ASP.NET的MVC中使用Session做身份验证(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1071 ...

  2. 问题分享:最近测试VDI-in-a-Box使用AD做身份验证出现以下错误提示:

    原文出处:http://vdi.so/blog/?p=4488 问题分享:最近测试VDI-in-a-Box使用AD做身份验证出现以下错误提示: 错误信息: Notification: Could no ...

  3. FreeRADIUS整合微软活动目录做身份验证时报错“winbind client not authorized to use winbindd_pam_auth_crap”的解决方法

    FreeRADIUS使用微软活动目录做身份验证时,当客户端发起认证请求到radius服务器时,radius服务器报错"winbind client not authorized to use ...

  4. ASP.NET Core 项目简单实现身份验证及鉴权

    环境 VS 2017 ASP.NET Core 2.2 目标 以相对简单优雅的方式实现用户身份验证和鉴权,解决以下两个问题: 无状态的身份验证服务,使用请求头附加访问令牌,几乎适用于手机.网页.桌面应 ...

  5. WCF消息拦截,利用消息拦截做身份验证服务

    本文参考  http://blog.csdn.net/tcjiaan/article/details/8274493  博客而写 添加对信息处理的类 /// <summary>/// 消息 ...

  6. ASP.NET的MVC中使用Session做身份验证(附代码下载)

    场景 ASP.NET中MVC编程模式简介与搭建HelloWorld项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10679 ...

  7. 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分

    目录 介绍 JWT(JSON Web令牌) ASP.NET Core中的JWToken配置 用户模型类 创建令牌 第1步 第2步 第4步 令牌存储 中间件 自定义中间件app.Use() 中间件app ...

  8. .NET Core 3.0中的Cookie身份验证

    目录 介绍 先决条件 创建Web应用程序的步骤 集成Cookie身份验证 Startup.cs文件的代码更改 将User.cs文件添加到Model文件夹 使用新的操作方法更新HomeControlle ...

  9. 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...

最新文章

  1. this指向undefined uiapp_JavaScript深入之史上最全5种this绑定全面解析
  2. python程序员收入-python收入
  3. 取代现有电商和实体店菜市场的新模式
  4. Linux软件安装的补充
  5. 多线程编程有什么用途_为什么建议你一定要学懂C++
  6. [Xcode 实际操作]七、文件与数据-(3)创建文本文件、属性列表文件、图片文件
  7. 对Web设计和开发人员有用的15个Chrome插件
  8. Linux学习:第一天,
  9. 五一档票房超8.8亿元!张艺谋新片仅第二
  10. 求你别自己瞎写工具类了,Spring自带的这些他不香吗?
  11. Nmap内网扫描端口
  12. 软件设计师备考全攻略(附本人笔记)
  13. 微信小程序如何搭建自己的后台(超详细,超完整)(上线必备)!!!
  14. 日志级别的选择:Debug、Info、Warn、Error还是Fatal
  15. python实现——处理Excel表格(超详细)
  16. java 线程阻止_Java:在特定队列大小后阻止提交的ExecutorService
  17. CF115B Lawnmower(贪心)
  18. 使用软件搭建RAID10
  19. 百度网盘安装在c盘显示系统权限限制的解决方法
  20. java架构设计图,不止面试题,笔记源码统统都有

热门文章

  1. 软件维护人员及运维人员岗位职责
  2. 明星直播的品牌效应,这几个关键数据你一定要知道!
  3. 智能指纹锁迎来大风口,能否在三年内成为大众消费品?
  4. TF Live 直播回放丨Frank Wu:当OpenStack遇到Tungsten Fabric
  5. [007]嵌入式学习:模数转换器-ADC
  6. javaee.jar与servlet-api.jar
  7. pandas 错误提醒:FutureWarning: elementwise comparison failed;
  8. 深度缓冲中的深度值计算及可视化
  9. 鸿蒙灵儿宠物奔驰法拉利,鄂P66666,从奔驰换成法拉利,车主还有限量版劳斯莱斯,中国只有三台...
  10. js word 预览_Node.js微服务实践(二)