当前位置:   article > 正文

ASP.NET FrameWork Web Api JWT Token验证和Attribute拦截器创建和调用Demo_apiauthorizeattribute jwt

apiauthorizeattribute jwt

简单口述一下这个JWT Token验证和Attribute拦截器在项目中起到的作用

一.Token存在的意义

Token的存是为了实现接口安全,比如当接口地址泄露了,别人随便就能访问了,当我们有了Token,当别人知道了我们的接口地址,他们没有Token,我们后台检测到token为空,就会返回请求错误

二.Attribute拦截器的意义

就是相当于别人调用你的接口方法,我们加了拦截器,别人调用我们接口的时候就会先进入拦截器,我们就可以先在拦截器里面做一个校验什么的操作了,当然拦截器有进入方法前,返回值前,返回值后等的拦截器,前面的文章我有写到过

三.JWT Token验证结合Attribute拦截器在项目中的使用流程简单描述(表达能力略差)

第一步:客户端登录

第二步:验证用户名和密码以及添加Token

第三步:当用户名密码验证通过且Token生成成功,则返回验证成功状态和token值给前端页面

第四步:前端页面接收到返回验证成功状态和token值则把token值存到页面缓存之中(怎么存都行看你们自己)

第五步:当我们进入主页做其它功能请求接口时,先获取页面缓存中的token,携带token请求接口

第六步:当我们请求方法时,方法加了拦截器,就会先进入拦截器,就会判断这个token是否存在且token值正确

第七步:当token传输过来无误就会解析token存储到请求上下文Request上下文中(这个解析之后你们也可以不用一定存储到Request上下文中,根据情况而定)

第八步:然后再进入请求的接口方法体中进行数据操作

下面开始我们Demo实战演习............................................................

1.添加项目

 2.添加model

  1. using System.Collections.Generic;
  2. namespace JwtWebApi.Models
  3. {
  4. public class AuthInfo
  5. {
  6. //模拟JWT的payload
  7. public string UserName { get; set; }
  8. public List<string> Roles { get; set; }
  9. public bool IsAdmin { get; set; }
  10. /// <summary>
  11. /// 过期时间
  12. /// </summary>
  13. public string ExpirationTime { get; set; }
  14. }
  15. }
  1. namespace JwtWebApi.Models
  2. {
  3. public class LoginRequest
  4. {
  5. public string UserName { get; set; }
  6. public string Password { get; set; }
  7. }
  8. }
  1. namespace JwtWebApi.Models
  2. {
  3. public class LoginResult
  4. {
  5. public bool Success { get; set; }
  6. public string Token { get; set; }
  7. public string Message { get; set; }
  8. }
  9. }

 3.添加拦截器(创建一个文件夹Attributes)添加一个ApiAuthorizeAttribute类

  1. using JWT;
  2. using JWT.Algorithms;
  3. using JWT.Serializers;
  4. using JwtWebApi.Models;
  5. using System;
  6. using System.Linq;
  7. using System.Web.Http;
  8. using System.Web.Http.Controllers;
  9. namespace JwtWebApi.Attributes
  10. {
  11. /// <summary>
  12. /// 拦截器
  13. /// </summary>
  14. public class ApiAuthorizeAttribute: AuthorizeAttribute
  15. {
  16. /// <summary>
  17. /// 验证请求是否携带token
  18. /// </summary>
  19. /// <param name="actionContext"></param>
  20. /// <returns></returns>
  21. protected override bool IsAuthorized(HttpActionContext actionContext)
  22. {
  23. //获取token
  24. var authHeader = from t in actionContext.Request.Headers
  25. where t.Key == "auth"
  26. select t.Value.FirstOrDefault();
  27. //验证token是否为空
  28. if (authHeader != null)
  29. {
  30. string token = authHeader.FirstOrDefault();
  31. if (!string.IsNullOrEmpty(token))
  32. {
  33. try
  34. {
  35. const string secret = "To Live is to change the world";
  36. //secret需要加密
  37. JWT.IJsonSerializer serializer = new JsonNetSerializer();
  38. IDateTimeProvider provider = new UtcDateTimeProvider();
  39. IJwtValidator validator = new JwtValidator(serializer, provider);
  40. IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
  41. IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
  42. IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
  43. var authInfo = decoder.DecodeToObject<AuthInfo>(token, secret, verify: true);
  44. if (authInfo != null)
  45. {
  46. //验证token是否超时,这里设置的过期时间为两小时
  47. if (Convert.ToDateTime(authInfo.ExpirationTime) < DateTime.Now.AddHours(2) && !string.IsNullOrEmpty(authInfo.ExpirationTime))
  48. {
  49. actionContext.RequestContext.RouteData.Values.Add("autninfoDate", authInfo);
  50. return true;
  51. }
  52. else return true;
  53. }
  54. return false;
  55. }
  56. catch (Exception ex)
  57. {
  58. return false;
  59. }
  60. }
  61. }
  62. return false;
  63. }
  64. }
  65. }

4.创建Controller

SignInController 控制器

  1. using JWT;
  2. using JWT.Algorithms;
  3. using JWT.Serializers;
  4. using JwtWebApi.Models;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Web.Http;
  8. namespace JwtWebApi.Controllers
  9. {
  10. public class SignInController : ApiController
  11. {
  12. /// <summary>
  13. /// 登录/生成token
  14. /// </summary>
  15. /// <param name="UserName">用户名</param>
  16. /// <param name="PassWord">密码</param>
  17. /// <returns></returns>
  18. [HttpGet]
  19. public LoginResult Post(string UserName,string PassWord)
  20. {
  21. LoginResult rs = new LoginResult();
  22. //这是是获取用户名和密码的,这里只是为了模拟
  23. AuthInfo info = new AuthInfo {
  24. UserName = UserName, //用户名
  25. Roles = new List<string> { "Admin", "Manage","YQ" }, //权限
  26. IsAdmin = true,
  27. ExpirationTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") };//过期时间
  28. try
  29. {
  30. const string secret = "To Live is to change the world";
  31. //secret需要加密
  32. IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
  33. IJsonSerializer serializer = new JsonNetSerializer();
  34. IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
  35. IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
  36. var token = encoder.Encode(info, secret);
  37. #region 模拟数据库存
  38. //登录用户名密码验证
  39. List<LoginRequest> list=new List<LoginRequest>();
  40. list.Add(new LoginRequest { UserName = "admin", Password = "admin" });
  41. #endregion
  42. //且数据库有这用户才能登录成功
  43. if (list.Exists(t => t.UserName == UserName && t.Password == PassWord)==false)
  44. return new LoginResult { Message = "登录失败,账号或密码错误!", Success = false };
  45. //验证token是否为空
  46. if (token==null || token=="")
  47. return new LoginResult { Message = "登录失败,token生成失败!", Success = false };
  48. return new LoginResult { Message = "登录成功!", Token = token, Success = true };
  49. }
  50. catch (Exception ex)
  51. {
  52. //异常返回
  53. return new LoginResult { Message = ex.Message, Success = false };
  54. }
  55. }
  56. }
  57. }

UserController 控制器

  1. using JwtWebApi.Attributes;
  2. using JwtWebApi.Models;
  3. using System.Web.Http;
  4. namespace JwtWebApi.Controllers
  5. {
  6. public class UserController : ApiController
  7. {
  8. /// <summary>
  9. /// 获取测试token
  10. /// </summary>
  11. /// <returns></returns>
  12. [ApiAuthorize]
  13. [HttpGet]
  14. public string Get11()
  15. {
  16. AuthInfo info = RequestContext.RouteData.Values["autninfoDate"] as AuthInfo;
  17. if (info == null)
  18. {
  19. return "获取不到,失败";
  20. }
  21. else
  22. {
  23. return $"获取到了,Auth的Name是 {info.UserName}";
  24. }
  25. }
  26. }
  27. }

 5.更改Home/Index页面内容

index页面内容

  1. <div class="jumbotron">
  2. <fieldset>
  3. <legend>身份验证</legend>
  4. <form id="form">
  5. <label for="UserName">用户名:</label><input type="text" name="userName" id="UserName" />
  6. <br />
  7. <br />
  8. <label for="Password">密码:</label><input type="password" name="password" id="PassWord" />
  9. <br />
  10. <br />
  11. </form>
  12. <button id="login">登录</button>
  13. </fieldset>
  14. <br />
  15. <fieldset>
  16. <button id="invoke">调用接口</button>
  17. </fieldset>
  18. <script src="~/Scripts/jquery-3.4.1.js"></script>
  19. <script src="~/Scripts/jquery-3.4.1.min.js"></script>
  20. <script>
  21. //调用api站点的登录接口,接口在登录成功后返回一个token。
  22. $("#login").on("click", function () {
  23. debugger
  24. var UserName = $("#UserName").val();
  25. if (!UserName) {
  26. alert("用户名不能为空!");
  27. return;
  28. }
  29. var PassWord = $("#PassWord").val();
  30. if (!PassWord) {
  31. alert("密码不能为空!");
  32. return;
  33. }
  34. $.ajax({
  35. //url: "https://localhost:44330/api/SignIn/Post?UserName=" + UserName + "&PassWord=" + PassWord + "",
  36. url: "../../api/SignIn/Post?UserName=" + UserName + "&PassWord=" + PassWord + "",
  37. method: "get",
  38. async: false,
  39. success: function (data) {
  40. if (data.Success) {
  41. //为简单起见,将token保存在全局变量中。
  42. window.token = data.Token;
  43. alert("登录成功");
  44. } else {
  45. alert("登录失败:" + data.Message);
  46. }
  47. }, error: function (XMLHttpRequest, textStatus, errorThrown) {
  48. console.log("请求进入error--" + XMLHttpRequest.status);
  49. // 状态
  50. console.log(XMLHttpRequest.readyState);
  51. // 错误信息
  52. console.log(textStatus);
  53. console.log(XMLHttpRequest.responseText);
  54. }
  55. });
  56. });
  57. //调用api站点的获取数据的接口,该接口要求身份验证。
  58. $("#invoke").on("click", function () {
  59. console.log(window.token);
  60. $.ajax({
  61. //url: "https://localhost:44330/api/User/Get11",
  62. url: "../../api/User/Get11",
  63. method: "get",
  64. headers: {
  65. "auth": window.token
  66. }, //通过请求头来发送token,放弃了通过cookie的发送方式
  67. complete: function (jqXHR, textStatus) {
  68. alert(jqXHR.responseText);
  69. }, error: function (XMLHttpRequest, textStatus, errorThrown) {
  70. console.log("请求进入error--" + XMLHttpRequest.status);
  71. // 状态
  72. console.log(XMLHttpRequest.readyState);
  73. // 错误信息
  74. console.log(textStatus);
  75. console.log(XMLHttpRequest.responseText);
  76. }
  77. });
  78. });
  79. </script>
  80. </div>

 完结撒花........

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/885565
推荐阅读
相关标签
  

闽ICP备14008679号