这是第二部:实现NetCore上的WebApi使用JWT认证

1、NetCore新建一个WebApi的项目

2、打开AppSettings.json,添加Jwt的信息,这里为了演示而已

  1. {
  2. "Logging": {
  3. "IncludeScopes": false,
  4. "Debug": {
  5. "LogLevel": {
  6. "Default": "Warning"
  7. }
  8. },
  9. "Console": {
  10. "LogLevel": {
  11. "Default": "Warning"
  12. }
  13. }
  14. },
  15. "JwtSettings": {
  16. "Issuer": "XXX",
  17. "Audience": "XXXX",
  18. "SecretKey": "To live is to change the world!"
  19. }
  20. }

3、Models下新建两个类,一个用于登录,一个用于获取配置文件中的值

  1. namespace NerCoreJwt.Models
  2. {
  3. public class LoginViewModel
  4. {
  5. public string UserName { get; set; } = "wangshibang";
  6.  
  7. public string Password { get; set; } = "";
  8. }
  9. }
  1. namespace NerCoreJwt.Models
  2. {
  3. public class JwtSettings
  4. {
  5. /// <summary>
  6. /// 证书颁发者
  7. /// </summary>
  8. public string Issuer { get; set; }
  9.  
  10. /// <summary>
  11. /// 允许使用的角色
  12. /// </summary>
  13. public string Audience { get; set; }
  14.  
  15. /// <summary>
  16. /// 加密字符串
  17. /// </summary>
  18. public string SecretKey { get; set; }
  19. }
  20.  
  21. }

4、新建一个Controller,用来写登录后生成Token逻辑

  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.Extensions.Options;
  3. using Microsoft.IdentityModel.Tokens;
  4. using NerCoreJwt.Models;
  5. using System;
  6. using System.IdentityModel.Tokens.Jwt;
  7. using System.Security.Claims;
  8. using System.Text;
  9.  
  10. namespace NerCoreJwt.Controllers
  11. {
  12. [Route("api/[controller]/[action]")]
  13. public class AuthorizeController : Controller
  14. {
  15. private JwtSettings setting;
  16. public AuthorizeController(IOptions<JwtSettings> options)
  17. {
  18. setting = options.Value;
  19. }
  20.  
  21. [HttpPost]
  22. public IActionResult Login(LoginViewModel login)
  23. {
  24. if (ModelState.IsValid)
  25. {
  26. if (login.UserName == "wangshibang" && login.Password == "")
  27. {
  28. var claims = new Claim[] {
  29. new Claim(ClaimTypes.Name, login.UserName),
  30. new Claim(ClaimTypes.Role, "admin, Manage")
  31. };
  32. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey));
  33. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  34. var token = new JwtSecurityToken(
  35. setting.Issuer,
  36. setting.Audience,
  37. claims,
  38. DateTime.Now,
  39. DateTime.Now.AddMinutes(),
  40. creds);
  41. return Ok(new { Token = new JwtSecurityTokenHandler().WriteToken(token) });
  42. }
  43. }
  44. return BadRequest();
  45. }
  46.  
  47. [HttpGet]
  48. public IActionResult NoValidate()
  49. {
  50. return Ok();
  51. }
  52. }
  53. }

5、StartUp类里面添加从Configure<JwtSettings>中获取Section才可以使用IOptions获取里面的内容,为了省事就全部贴出来了

  1. using Microsoft.AspNetCore.Authentication.JwtBearer;
  2. using Microsoft.AspNetCore.Builder;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.Extensions.Configuration;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using NerCoreJwt.Models;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9.  
  10. namespace NerCoreJwt
  11. {
  12. public class Startup
  13. {
  14. public Startup(IConfiguration configuration)
  15. {
  16. Configuration = configuration;
  17. }
  18.  
  19. public IConfiguration Configuration { get; }
  20.  
  21. // This method gets called by the runtime. Use this method to add services to the container.
  22. public void ConfigureServices(IServiceCollection services)
  23. {
  24. services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
  25. JwtSettings setting = new JwtSettings();
  26. Configuration.Bind("JwtSettings", setting);
  27. services.AddAuthentication(option =>
  28. {
  29. option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  30. option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  31. }).AddJwtBearer(config =>
  32. {
  33. /*
  34. config.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
  35. {
  36. ValidAudience = setting.Audience,
  37. ValidIssuer = setting.Issuer,
  38. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))
  39. };
  40. */
  41. config.SecurityTokenValidators.Clear();
  42. config.SecurityTokenValidators.Add(new MyTokenValidate());
  43. config.Events = new JwtBearerEvents()
  44. {
  45. OnMessageReceived = context =>
  46. {
  47. var token = context.Request.Headers["myToken"];
  48. context.Token = token.FirstOrDefault();
  49. return Task.CompletedTask;
  50. }
  51.  
  52. };
  53. });
  54.  
  55. services.AddMvc();
  56. }
  57.  
  58. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  59. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  60. {
  61. if (env.IsDevelopment())
  62. {
  63. app.UseDeveloperExceptionPage();
  64. }
  65. app.UseAuthentication();
  66. app.UseMvc();
  67. }
  68. }
  69. }

6、Token生成了,可以用PostMan调用接口试试,把生成的Token粘到jwt.io官网看看里面的信息

下面我们来进行授权

7、为了自定义授权方法,我们需要新建一个类,继承自ISecurityTokenValidator接口

  1. using Microsoft.AspNetCore.Authentication.JwtBearer;
  2. using Microsoft.IdentityModel.Tokens;
  3. using System.IdentityModel.Tokens.Jwt;
  4. using System.Linq;
  5. using System.Security.Claims;
  6.  
  7. namespace NerCoreJwt
  8. {
  9. public class MyTokenValidate : ISecurityTokenValidator
  10. {
  11. public bool CanValidateToken => true;
  12.  
  13. public int MaximumTokenSizeInBytes { get ; set ; }
  14.  
  15. public bool CanReadToken(string securityToken)
  16. {
  17. return true;
  18. }
  19.  
  20. public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
  21. {
  22. ClaimsPrincipal principal;
  23. try
  24. {
  25. validatedToken = null;
  26. //这里需要验证生成的Token
  27. /*
  28. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoid2FuZ3NoaWJhbmciLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJhZG1pbiwgTWFuYWdlIiwibmJmIjoxNTIyOTI0MDgxLCJleHAiOjE1MjI5MjU4ODEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMCIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTAwMCJ9.fa0jDYt_MqHFcwQfsMS30eCsjEwQt_uiv96bGtMQJBE
  29. */
  30. var token = new JwtSecurityToken(securityToken);
  31. //获取到Token的一切信息
  32. var payload = token.Payload;
  33. var role = (from t in payload where t.Key == ClaimTypes.Role select t.Value).FirstOrDefault();
  34. var name = (from t in payload where t.Key == ClaimTypes.Name select t.Value).FirstOrDefault();
  35. var issuer = token.Issuer;
  36. var key = token.SecurityKey;
  37. var audience = token.Audiences;
  38. var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
  39. identity.AddClaim(new Claim(ClaimTypes.Name, name.ToString()));
  40. identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, "admin"));
  41. principal = new ClaimsPrincipal(identity);
  42. }
  43. catch
  44. {
  45. validatedToken = null; principal = null;
  46. }
  47. return principal;
  48. }
  49. }
  50. }

8、然后注释掉上面代码我注册的部分,因为这是原生的Authorize验证特性,添加后面的自定义验证逻辑

9、在接口上面添加Authorize特性,用PostMan调用接口传入生成的Token,设置断点看看效果吧

  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using System.Collections.Generic;
  4.  
  5. namespace NerCoreJwt.Controllers
  6. {
  7. [Route("api/[controller]")]
  8. public class ValuesController : Controller
  9. {
  10. // GET api/values
  11. [Authorize(Roles = "admin")]
  12. [HttpGet]
  13. public IEnumerable<string> Get()
  14. {
  15. return new string[] { "value1", "value2" };
  16. }
  17.  
  18. // GET api/values/5
  19. [HttpGet("{id}")]
  20. public string Get(int id)
  21. {
  22. return "value";
  23. }
  24.  
  25. // POST api/values
  26. [HttpPost]
  27. public void Post([FromBody]string value)
  28. {
  29. }
  30.  
  31. // PUT api/values/5
  32. [HttpPut("{id}")]
  33. public void Put(int id, [FromBody]string value)
  34. {
  35. }
  36.  
  37. // DELETE api/values/5
  38. [HttpDelete("{id}")]
  39. public void Delete(int id)
  40. {
  41. }
  42. }
  43. }

WebApi使用JWT认证(二)的更多相关文章

  1. WebApi使用JWT认证(一)

    这是第一部:先实现NetFramework上的WebApi使用JWT认证 1.VS新建一个WebApi项目 2.项目右键----管理Nuget程序包----找到JWT,然后安装 3.Model文件夹下 ...

  2. WebApi使用JWT认证

    https://www.cnblogs.com/wangyulong/p/8727683.html https://blog.csdn.net/kebi007/article/details/7286 ...

  3. .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)

    上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...

  4. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  5. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...

  6. NetCore+Dapper WebApi架构搭建(六):添加JWT认证

    WebApi必须保证安全,现在来添加JWT认证 1.打开appsettings.json添加JWT认证的配置信息 2.在项目根目录下新建一个Models文件夹,添加一个JwtSettings.cs的实 ...

  7. Dotnet core使用JWT认证授权最佳实践(二)

    最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 第一部分:Dotnet core使用JWT认证授权最佳实践(一) ...

  8. DRF JWT认证(二)

    快速上手JWT签发token和认证,有这一篇就够了,DRF自带的和自定义的都帮你总结好了,拿去用~

  9. Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用

    1:导入NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer 2:配置 jwt相关信息 3:在 startUp中 public void Confi ...

随机推荐

  1. .net core 中 identity server 4 之Server简单示例

    Steps: 1.新建一个ASP.NET Core Web项目,SigmalHex.IdentityServer: 2.安装包 Install-Package IdentityServer4 3.St ...

  2. Tomcat处理一个http请求的过程

    假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Con ...

  3. [php]几个常用函数

    count(arr);用于统计数组的元素个数 is_array(arr);判断给定变量是不是数组 var_dump(var||arr);打印数组或变量信息(类型和值): print_r(var||ar ...

  4. 【BZOJ】2440: [中山市选2011]完全平方数

    [题意]T次询问第k小的非完全平方数倍数的数.T<=50,k<=10^9.(即无平方因子数——素因数指数皆为0或1的数) [算法]数论(莫比乌斯函数) [题解]考虑二分,转化为询问[1,x ...

  5. js、php本周第一天和本周最后一天

    PHP:本周一 echo date('Y-m-d',(time()-((date('w')==0?7:date('w'))-1)*24*3600)); //w为星期几的数字形式,这里0为周日 本周日 ...

  6. 如何将vmworkstation的虚机导成ovf模版

    如何将vmworkstation的虚机导成ovf模版 最近碰见一个事情挺烦的苦恼了我好长一段时间,是这样的公司要进行攻防演练需要搭建一个owaps的靶站练手,环境我在我的电脑上已经搭好了(vmwork ...

  7. nginx证书制作以及配置https并设置访问http自动跳转https(反向代理转发jboss)

    nginx证书制作以及配置https并设置访问http自动跳转https 默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖 ...

  8. http 错误代码解释 && nginx 自定义错误【转】

    如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求. 此状态代 ...

  9. Docker Commands

    Docker Commands 安装,以Ubuntu 14.04.3为例 apt-get install docker.io 注意安装之前需要更新系统 列出曾经存在的容器 docker ps -a 列 ...

  10. [ python ] 购物系统

    作业需求 1. 购物系统,能够注册登录,用户第一次登录后,让用户输入金额,然后打印商品列表2. 允许用户根据商品编号购买商品3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4. 购买完一 ...