博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
菜鸟入门【ASP.NET Core】11:应用Jwtbearer Authentication、生成jwt token
阅读量:6908 次
发布时间:2019-06-27

本文共 5358 字,大约阅读时间需要 17 分钟。

准备工作

用VSCode新建webapi项目JwtAuthSample,并打开所在文件夹项目

dotnet new webapi --name JwtAuthSample

编辑JwtAuthSample.csproj,添加watch

重新生成一下项目

dotnet restore

然后运行

dotnet watch run

这时候可以用postman来模拟访问一下webapi

配置Jwt

在ValuesController中添加引用

using Microsoft.AspNetCore.Authorization;

给控制器添加标签[Authorize]

 

然后在Startup.cs中的Configure方法中配置使用Authentication

app.UseAuthentication();

添加JwtBearer引用

using Microsoft.AspNetCore.Authentication.JwtBearer;

接下来需要新建一个文件夹Models,在文件夹下面新建一个类JwtSettings.cs

namespace JwtAuthSample{    public class JwtSettings    {        //token是谁颁发的        public string Issuer { get; set; }        //token可以给哪些客户端使用        public string Audience { get; set; }        //加密的key        public string SecretKey{get;set;}    }}

 

然后需要在appsettings.json中配置jwt参数的值 【注意】 SecretKey必须大于16个,是大于,不是大于等于

{  "Logging": {    "IncludeScopes": false,    "Debug": {      "LogLevel": {        "Default": "Warning"      }    },    "Console": {      "LogLevel": {        "Default": "Warning"      }    }  },    "JwtSettings":{    "Issuer":"http://localhost:5000",    "Audience":"http://localhost:5000",    "SecretKey":"Hello-key-----wyt"  }}

 

这时候重新回到Startup.cs的ConfigureServices方法下,将appsettings.json中的文件读取到JwtSettings中,进行Bind,然后设置jwt参数

添加如下引用

using Microsoft.IdentityModel.Tokens;using System.Text;

ConfigureServices代码

public void ConfigureServices(IServiceCollection services)        {            //将appsettings.json中的JwtSettings部分文件读取到JwtSettings中,这是给其他地方用的            services.Configure
(Configuration.GetSection("JwtSettings")); //由于初始化的时候我们就需要用,所以使用Bind的方式读取配置 //将配置绑定到JwtSettings实例中 var jwtSettings=new JwtSettings(); Configuration.Bind("JwtSettings",jwtSettings); services.AddAuthentication(options=>{ //认证middleware配置 options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(o=>{ //主要是jwt token参数设置 o.TokenValidationParameters=new Microsoft.IdentityModel.Tokens.TokenValidationParameters{
            //Token颁发机构 ValidIssuer =jwtSettings.Issuer,             //颁发给谁 ValidAudience =jwtSettings.Audience, //这里的key要进行加密,需要引用Microsoft.IdentityModel.Tokens IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey))             //ValidateIssuerSigningKey=true,             是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比             //ValidateLifetime=true,             允许的服务器时间偏移量             //ClockSkew=TimeSpan.Zero }; }); services.AddMvc(); }

 

这时再通过postman访问5000端口,发现状态码为401(未授权)

生成 JWT Token

扩展安装

先安装几个重要的扩展

这时候可以在商店中搜索NuGet Package Manager进行安装,安装完成后点击重新加载即可。

如果需要安装nuget包的话,只要在【查看】-》【命令面板】中输入NuGet Package Manager,即可进入package安装,输入Microsoft.AspNetCore.Authentication.JwtBearer即可进行安装

这时候查看项目文件发现已经安装成功

 

生成jwt token

首先新建一个ViewModel文件夹,并在ViewModel文件夹下面新建LoginViewModel.cs

using System.ComponentModel.DataAnnotations;namespace JwtAuthSample{    public class LoginViewModel    {        //用户名        [Required]        public string User { get; set; }        //密码        [Required]        public string Password { get; set; }    }}

接下来在Controllers文件夹下新建控制器AuthorizeController.cs,完整代码如下

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;//引用命名空间using System.Security.Claims;using Microsoft.IdentityModel.Tokens;using Microsoft.Extensions.Options;using System.Text;using System.IdentityModel.Tokens.Jwt;namespace JwtAuthSample.Controllers{    [Route("api/[controller]")]    public class AuthorizeController : Controller    {        private JwtSettings _jwtSettings;        public AuthorizeController(IOptions
_jwtSettingsAccesser) { _jwtSettings=_jwtSettingsAccesser.Value; } [HttpPost] public IActionResult Token([FromBody]LoginViewModel viewModel) { if(ModelState.IsValid)//判断是否合法 { if(!(viewModel.User=="wyt"&&viewModel.Password=="123456"))//判断账号密码是否正确 { return BadRequest(); } var claim=new Claim[]{ new Claim(ClaimTypes.Name,"wyt"), new Claim(ClaimTypes.Role,"admin") }; //对称秘钥 var key=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey)); //签名证书(秘钥,加密算法) var creds=new SigningCredentials(key,SecurityAlgorithms.HmacSha256); //生成token [注意]需要nuget添加Microsoft.AspNetCore.Authentication.JwtBearer包,并引用System.IdentityModel.Tokens.Jwt命名空间 var token=new JwtSecurityToken(_jwtSettings.Issuer,_jwtSettings.Audience,claim,DateTime.Now,DateTime.Now.AddMinutes(30),creds); return Ok(new {token=new JwtSecurityTokenHandler().WriteToken(token)}); } return BadRequest(); } }}

这时候用postman进行请求

此时访问http://localhost:5000/api/values端口发现401无法访问

 

这时候加上token进行访问,访问成功

token校验

 可以把生成的token放在官方网站上进行校验

官方网址:

这时候把的json粘贴进去会发现部分信息已经解析出来了,而由于secret只有自己填进去才能校验成功,否则校验失败。

 

这时我们填进去正确的secretkey:Hello-key-----wyt   校验成功

转载地址:http://lbwcl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
我的友情链接
查看>>
禁止 centos 休眠
查看>>
列表删除页代码
查看>>
flume源码分析1-启动过程
查看>>
亚马逊的EC2云计算系统
查看>>
流练习————文件的合并与切割
查看>>
分别让div浮层靠左靠右和居中
查看>>
如何解决 JMeter 通过 JDBC 访问 Oracle 和 MySQL 的问题 (留言中有 Test Plan 实例下载)...
查看>>
19.7 主动模式和被动模式;19.8 添加监控主机;19.9 添加自定义模板19.10处理图形中的...
查看>>
SCOM2012功能测试(14)—创建.NET应用程序性能监控
查看>>
MDT2012/13功能测试(13)—Rules参数示例(Refresh)
查看>>
Java面试题
查看>>
我的友情链接
查看>>
IEnumerable和IEnumerable<T>接口
查看>>
重定向redirect与跳转forward区别
查看>>
CentOS7之Rsync+Inotify架构实现实时同步文件和文件夹
查看>>
linux日志管理
查看>>
A.约数个数的和
查看>>
BZOJ1041:[HAOI2008]圆上的整点(数论)
查看>>