Asp.net Core认证和授权:JWT认证和授权
JWT验证一般用户移动端,因为它不像cookie验证那样,没有授权跳转到登陆页面
JWT是json web token的简称,在 jwt.io 网址可以看到
新建一个API项目,通过postman 可以访问:
JWT在命名空间:using Microsoft.AspNetCore.Authentication.JwtBearer;
添加JWT实体类
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;namespace Api.Models {public class JwtSettings{/// <summary>/// Token是谁颁发的/// </summary>public string Issuer { get; set; }/// <summary>/// Token给那些客户端去使用/// </summary>public string Audience { get; set; }/// <summary>/// 用于加密的key 必须是16个字符以上,要大于128个字节/// </summary>public string SecetKey { get; set; }} }
添加配置文件
添加JWT认证
public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.Configure<JwtSettings>(Configuration);var jwtSettings = new JwtSettings();Configuration.Bind("JwtSettings", jwtSettings);services.AddAuthentication(option => {option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(option=> {option.TokenValidationParameters = new TokenValidationParameters {ValidIssuer = jwtSettings.Issuer,ValidAudience = jwtSettings.Audience,IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecetKey)) /***********************************TokenValidationParameters的参数默认值***********************************/ // RequireSignedTokens = true, // SaveSigninToken = false, // ValidateActor = false, // 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。 // ValidateAudience = true, // ValidateIssuer = true, // ValidateIssuerSigningKey = false, // 是否要求Token的Claims中必须包含Expires // RequireExpirationTime = true, // 允许的服务器时间偏移量 // ClockSkew = TimeSpan.FromSeconds(300), // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比 // ValidateLifetime = true};});}
添加中间件(Middleware)
app.UseAuthentication();
API接口打上标签:
然后在postman访问 就是401 未授权
接下来需要给用户颁发Token
当用户登陆成功后,颁发token
创建登陆API和实体类
namespace Api.Models {public class LoginViewModel{[Required]public string user { get; set; }[Required]public string pwd { get; set; }} }
using Api.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text;namespace Api.Controllers {//[Route("api/[controller]")]//[ApiController]public class AuthorizeController : ControllerBase{private JwtSettings _jwtSettings;public AuthorizeController(IOptions<JwtSettings> jwtSetting){_jwtSettings = jwtSetting.Value;}[HttpPost]public IActionResult Token([FromBody]LoginViewModel login){if (ModelState.IsValid){if (!(login.user == "cnglgos" && login.pwd == "123")){return BadRequest();}var claim = new Claim[] {new Claim("name","cnbogs"),new Claim("role","admin")};var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);//neget包:Microsoft.AspNetCore.Authentication.JwtBearer//命名空间: System.IdentityModel.Tokens.Jwt;//第一种方式var token = new JwtSecurityToken(_jwtSettings.Issuer,// Issuer 颁发者,通常为STS服务器地址_jwtSettings.Audience,// Audience Token的作用对象,也就是被访问的资源服务器授权标识 claim,DateTime.Now, //Token生效时间,在此之前不可用DateTime.Now.AddMinutes(30), //Token过期时间,在此之后不可用 creds);//第二种方式var descriptor = new SecurityTokenDescriptor{Issuer = _jwtSettings.Issuer,Audience = _jwtSettings.Audience,// Audience Token的作用对象,也就是被访问的资源服务器授权标识Subject = new ClaimsIdentity(claim),NotBefore = DateTime.Now, //Token生效时间,在此之前不可用Expires = DateTime.Now.AddMinutes(30), //Token过期时间,在此之后不可用SigningCredentials = creds,IssuedAt=DateTime.Now //Token颁发时间 };var handler = new JwtSecurityTokenHandler();JwtSecurityToken token1 = handler.CreateJwtSecurityToken(descriptor);return Ok(new{token = new JwtSecurityTokenHandler().WriteToken(token),token1 = handler.WriteToken(token1)});}return BadRequest();}public IActionResult Index(){return Ok();}} }
Postman请求
然后上面的Token 请求 https://localhost:5001/api/values
从headers可以看到,前缀必须是Bearer
我们可以自定义Token,必须继承接口:ISecurityTokenValidator
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Collections.Generic; using System.Security.Claims; namespace Api.Models {public class TokenValidtor : ISecurityTokenValidator{public bool CanValidateToken => true;public int MaximumTokenSizeInBytes { get; set; }public bool CanReadToken(string securityToken){return true;}public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken){validatedToken = null; var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); if (securityToken == "cnblgos") { var claim = new List<Claim> { new Claim("name","cnblogs"), new Claim("role","admin") }; identity.AddClaims(claim); } var principal = new ClaimsPrincipal(identity); return principal;}} }
然后在StartUp中修改:
public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);/*appsettings.json文件中JwtSettings是单独的一节,所以要GetSection方法获取*/services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));//services.Configure<JwtSettings>(Configuration);var jwtSettings = new JwtSettings();Configuration.Bind("JwtSettings", jwtSettings);services.AddAuthentication(option =>{option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(option =>{//option.TokenValidationParameters = new TokenValidationParameters {// ValidIssuer = jwtSettings.Issuer,// ValidAudience = jwtSettings.Audience,// IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)) option.SecurityTokenValidators.Clear();option.SecurityTokenValidators.Add(new TokenValidtor());option.Events = new JwtBearerEvents{OnMessageReceived = context =>{var token = context.Request.Headers["token"];context.Token = token.FirstOrDefault();return Task.CompletedTask;}};});}
//添加Policy和Claim授权
services.AddAuthorization(options => {
options.AddPolicy("nsky", policy => policy.RequireClaim("nsky")); });
Token可以去jwt.io 网站验证
参考大神的文章:https://www.cnblogs.com/RainingNight/p/jwtbearer-authentication-in-asp-net-core.html
转载于:https://www.cnblogs.com/nsky/p/10312101.html
Asp.net Core认证和授权:JWT认证和授权相关推荐
- ASP.NET Core 实现基于 ApiKey 的认证
ASP.NET Core 实现基于 ApiKey 的认证 Intro 之前我们有介绍过实现基于请求头的认证,今天来实现一个基于 ApiKey 的认证方式,使用方式参见下面的示例 Sample 注册认证 ...
- ASP.NET Core 2.1中基于角色的授权
授权是来描述用户能够做什么的过程.例如,只允许管理员用户可以在电脑上进行软件的安装以及卸载.而非管理员用户只能使用软件而不能进行软件的安装以及卸载.它是独立的而又与验证配合使用,需要身份验证机制.对于 ...
- ASP.NET Core WebAPI中使用JWT Bearer认证和授权
为什么是 JWT Bearer ASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer, ...
- ASP.NET Core 3.0 gRPC 身份认证和授权
一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...
- kong插件应用(熔断 限流,黑白名单,认证(basic,key,jwt,hmac,),授权,加密,zipkin链路跟踪,日志, prometheus可视化, 爬虫控制插件)
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 kong安装部署以及kong-dashboard参考:https://blog.csdn.net/luanpeng825485697/article/ ...
- .net Core .net6 Cookie加Jwt认证 同时生效
本文环境 Visual Studio 2022, .Net6 关于Cookie认证见,上篇 http://t.csdn.cn/ebmkT本文是接着添加Jwt认证的.流程简单代码不多. 目录 一.确定J ...
- ASP.NET Core 基于角色的 JWT 令牌
原文:https://bit.ly/3vYljq3 作者:Rick Strahl 翻译:精致码农-王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知 ...
- ASP.net Core 2.2中Jwt验证的使用方法及在微信小程序上应用
文章目录 Jwt简单介绍 什么是Jwt Jwt安全吗 在 ASP.NET Core中使用Jwt 授权和认证 三步走代码例子 生成Jwt 编辑授权策略 在StartUp中配置 添加特性 客户端使用 测试 ...
- ASP.NET Core Web Api之JWT VS Session VS Cookie(二)
本文我们来探讨下JWT VS Session的问题,我们可直接抛出问题:使用客户端存储的JWT比服务端维持Session更好吗? 既然要比较JWT VS Session,那我们就得知道为何需要JWT和 ...
- ASP.NET Core Web Api之JWT(一)
最近沉寂了一段,主要是上半年相当于休息和调整了一段时间,接下来我将开始陆续学习一些新的技能,比如Docker.Jenkins等,都会以生活实例从零开始讲解起,到时一并和大家分享和交流.接下来几节课的内 ...
最新文章
- CYQ学习主要摘要4
- iOS----------拨打电话的3种方式
- 目前的计算机聪原理上讲,计算机组成原理-第23-24讲(第7章)+课件.ppt
- python打印log重复问题
- day1---python的基础特性
- 宣布降低Windows Azure Storage的定价
- ionic3 cordova ionic-native插件
- 线性表的顺序存储的基本操作
- Linux下使用Iptraf进行网络流量的分析
- python竖着输出编码_在Python中使用管道标准输出时设置正确的编码
- 酷炫的VR选座,阿里大麦背后的技术堪称豪华
- 怎么使用水经注万能地图下载器制作百度个性化建筑地图
- 「一本通 4.5 例 1」树的统计(树链剖分)
- AD PCBlayout 总结
- Deprecated: Function eregi() is deprecated in ……【解决方法】
- python读取邮箱邮件_Python读取我的outlook邮箱并分析邮件
- u盘服务器安装win7系统安装教程视频教程,小白U盘安装win7系统教程
- Python学习随笔:PyCharm的错误检测使用及调整配置减少错误数量
- 考研面试php,考研复试 | 盘点:这些院校已公布2019考研复试内容
- 古代情感诗词top100