WebApi使用JWT认证(二)
这是第二部:实现NetCore上的WebApi使用JWT认证
1、NetCore新建一个WebApi的项目
2、打开AppSettings.json,添加Jwt的信息,这里为了演示而已
- {
- "Logging": {
- "IncludeScopes": false,
- "Debug": {
- "LogLevel": {
- "Default": "Warning"
- }
- },
- "Console": {
- "LogLevel": {
- "Default": "Warning"
- }
- }
- },
- "JwtSettings": {
- "Issuer": "XXX",
- "Audience": "XXXX",
- "SecretKey": "To live is to change the world!"
- }
- }
3、Models下新建两个类,一个用于登录,一个用于获取配置文件中的值
- namespace NerCoreJwt.Models
- {
- public class LoginViewModel
- {
- public string UserName { get; set; } = "wangshibang";
- public string Password { get; set; } = "";
- }
- }
- namespace NerCoreJwt.Models
- {
- public class JwtSettings
- {
- /// <summary>
- /// 证书颁发者
- /// </summary>
- public string Issuer { get; set; }
- /// <summary>
- /// 允许使用的角色
- /// </summary>
- public string Audience { get; set; }
- /// <summary>
- /// 加密字符串
- /// </summary>
- public string SecretKey { get; set; }
- }
- }
4、新建一个Controller,用来写登录后生成Token逻辑
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Options;
- using Microsoft.IdentityModel.Tokens;
- using NerCoreJwt.Models;
- using System;
- using System.IdentityModel.Tokens.Jwt;
- using System.Security.Claims;
- using System.Text;
- namespace NerCoreJwt.Controllers
- {
- [Route("api/[controller]/[action]")]
- public class AuthorizeController : Controller
- {
- private JwtSettings setting;
- public AuthorizeController(IOptions<JwtSettings> options)
- {
- setting = options.Value;
- }
- [HttpPost]
- public IActionResult Login(LoginViewModel login)
- {
- if (ModelState.IsValid)
- {
- if (login.UserName == "wangshibang" && login.Password == "")
- {
- var claims = new Claim[] {
- new Claim(ClaimTypes.Name, login.UserName),
- new Claim(ClaimTypes.Role, "admin, Manage")
- };
- var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey));
- var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
- var token = new JwtSecurityToken(
- setting.Issuer,
- setting.Audience,
- claims,
- DateTime.Now,
- DateTime.Now.AddMinutes(),
- creds);
- return Ok(new { Token = new JwtSecurityTokenHandler().WriteToken(token) });
- }
- }
- return BadRequest();
- }
- [HttpGet]
- public IActionResult NoValidate()
- {
- return Ok();
- }
- }
- }
5、StartUp类里面添加从Configure<JwtSettings>中获取Section才可以使用IOptions获取里面的内容,为了省事就全部贴出来了
- using Microsoft.AspNetCore.Authentication.JwtBearer;
- using Microsoft.AspNetCore.Builder;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.DependencyInjection;
- using NerCoreJwt.Models;
- using System.Linq;
- using System.Threading.Tasks;
- namespace NerCoreJwt
- {
- public class Startup
- {
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
- public IConfiguration Configuration { get; }
- // This method gets called by the runtime. Use this method to add services to the container.
- public void ConfigureServices(IServiceCollection services)
- {
- services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
- JwtSettings setting = new JwtSettings();
- Configuration.Bind("JwtSettings", setting);
- services.AddAuthentication(option =>
- {
- option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
- }).AddJwtBearer(config =>
- {
- /*
- config.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
- {
- ValidAudience = setting.Audience,
- ValidIssuer = setting.Issuer,
- IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))
- };
- */
- config.SecurityTokenValidators.Clear();
- config.SecurityTokenValidators.Add(new MyTokenValidate());
- config.Events = new JwtBearerEvents()
- {
- OnMessageReceived = context =>
- {
- var token = context.Request.Headers["myToken"];
- context.Token = token.FirstOrDefault();
- return Task.CompletedTask;
- }
- };
- });
- services.AddMvc();
- }
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- app.UseAuthentication();
- app.UseMvc();
- }
- }
- }
6、Token生成了,可以用PostMan调用接口试试,把生成的Token粘到jwt.io官网看看里面的信息
下面我们来进行授权
7、为了自定义授权方法,我们需要新建一个类,继承自ISecurityTokenValidator接口
- using Microsoft.AspNetCore.Authentication.JwtBearer;
- using Microsoft.IdentityModel.Tokens;
- using System.IdentityModel.Tokens.Jwt;
- using System.Linq;
- using System.Security.Claims;
- namespace NerCoreJwt
- {
- public class MyTokenValidate : 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)
- {
- ClaimsPrincipal principal;
- try
- {
- validatedToken = null;
- //这里需要验证生成的Token
- /*
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoid2FuZ3NoaWJhbmciLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJhZG1pbiwgTWFuYWdlIiwibmJmIjoxNTIyOTI0MDgxLCJleHAiOjE1MjI5MjU4ODEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMCIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMCJ9.fa0jDYt_MqHFcwQfsMS30eCsjEwQt_uiv96bGtMQJBE
- */
- var token = new JwtSecurityToken(securityToken);
- //获取到Token的一切信息
- var payload = token.Payload;
- var role = (from t in payload where t.Key == ClaimTypes.Role select t.Value).FirstOrDefault();
- var name = (from t in payload where t.Key == ClaimTypes.Name select t.Value).FirstOrDefault();
- var issuer = token.Issuer;
- var key = token.SecurityKey;
- var audience = token.Audiences;
- var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
- identity.AddClaim(new Claim(ClaimTypes.Name, name.ToString()));
- identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, "admin"));
- principal = new ClaimsPrincipal(identity);
- }
- catch
- {
- validatedToken = null; principal = null;
- }
- return principal;
- }
- }
- }
8、然后注释掉上面代码我注册的部分,因为这是原生的Authorize验证特性,添加后面的自定义验证逻辑
9、在接口上面添加Authorize特性,用PostMan调用接口传入生成的Token,设置断点看看效果吧
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.Mvc;
- using System.Collections.Generic;
- namespace NerCoreJwt.Controllers
- {
- [Route("api/[controller]")]
- public class ValuesController : Controller
- {
- // GET api/values
- [Authorize(Roles = "admin")]
- [HttpGet]
- public IEnumerable<string> Get()
- {
- return new string[] { "value1", "value2" };
- }
- // GET api/values/5
- [HttpGet("{id}")]
- public string Get(int id)
- {
- return "value";
- }
- // POST api/values
- [HttpPost]
- public void Post([FromBody]string value)
- {
- }
- // PUT api/values/5
- [HttpPut("{id}")]
- public void Put(int id, [FromBody]string value)
- {
- }
- // DELETE api/values/5
- [HttpDelete("{id}")]
- public void Delete(int id)
- {
- }
- }
- }
WebApi使用JWT认证(二)的更多相关文章
- WebApi使用JWT认证(一)
这是第一部:先实现NetFramework上的WebApi使用JWT认证 1.VS新建一个WebApi项目 2.项目右键----管理Nuget程序包----找到JWT,然后安装 3.Model文件夹下 ...
- WebApi使用JWT认证
https://www.cnblogs.com/wangyulong/p/8727683.html https://blog.csdn.net/kebi007/article/details/7286 ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- ASP.NET WebApi 基于JWT实现Token签名认证
一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...
- NetCore+Dapper WebApi架构搭建(六):添加JWT认证
WebApi必须保证安全,现在来添加JWT认证 1.打开appsettings.json添加JWT认证的配置信息 2.在项目根目录下新建一个Models文件夹,添加一个JwtSettings.cs的实 ...
- Dotnet core使用JWT认证授权最佳实践(二)
最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 第一部分:Dotnet core使用JWT认证授权最佳实践(一) ...
- DRF JWT认证(二)
快速上手JWT签发token和认证,有这一篇就够了,DRF自带的和自定义的都帮你总结好了,拿去用~
- Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用
1:导入NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer 2:配置 jwt相关信息 3:在 startUp中 public void Confi ...
随机推荐
- .net core 中 identity server 4 之Server简单示例
Steps: 1.新建一个ASP.NET Core Web项目,SigmalHex.IdentityServer: 2.安装包 Install-Package IdentityServer4 3.St ...
- Tomcat处理一个http请求的过程
假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Con ...
- [php]几个常用函数
count(arr);用于统计数组的元素个数 is_array(arr);判断给定变量是不是数组 var_dump(var||arr);打印数组或变量信息(类型和值): print_r(var||ar ...
- 【BZOJ】2440: [中山市选2011]完全平方数
[题意]T次询问第k小的非完全平方数倍数的数.T<=50,k<=10^9.(即无平方因子数——素因数指数皆为0或1的数) [算法]数论(莫比乌斯函数) [题解]考虑二分,转化为询问[1,x ...
- js、php本周第一天和本周最后一天
PHP:本周一 echo date('Y-m-d',(time()-((date('w')==0?7:date('w'))-1)*24*3600)); //w为星期几的数字形式,这里0为周日 本周日 ...
- 如何将vmworkstation的虚机导成ovf模版
如何将vmworkstation的虚机导成ovf模版 最近碰见一个事情挺烦的苦恼了我好长一段时间,是这样的公司要进行攻防演练需要搭建一个owaps的靶站练手,环境我在我的电脑上已经搭好了(vmwork ...
- nginx证书制作以及配置https并设置访问http自动跳转https(反向代理转发jboss)
nginx证书制作以及配置https并设置访问http自动跳转https 默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖 ...
- http 错误代码解释 && nginx 自定义错误【转】
如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求. 此状态代 ...
- Docker Commands
Docker Commands 安装,以Ubuntu 14.04.3为例 apt-get install docker.io 注意安装之前需要更新系统 列出曾经存在的容器 docker ps -a 列 ...
- [ python ] 购物系统
作业需求 1. 购物系统,能够注册登录,用户第一次登录后,让用户输入金额,然后打印商品列表2. 允许用户根据商品编号购买商品3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4. 购买完一 ...