zoukankan      html  css  js  c++  java
  • Web APIs 基于令牌TOKEN验证的实现

    Web APIs 基于令牌TOKEN验证的实现

    概述: 

      ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作。但是在使用API的时候总会遇到跨域请求的问题, 特别各种APP万花齐放的今天,对API使用者身份角色验证是不能避免的(完全开发的API不需要对使用者身份角色进行管控,可以绕过),这篇文章就来谈谈基于令牌TOKEN身份验证的实现。

    问题:

       对于Web API的选择性的开放,使用者无论使用AJAX,还是HttpClient对接,总要对使用者的身份角色进行验证,然而使用API总有跨域使用情况的存在,这样就导致所有基于cookie验证方式都不再适用于API的验证。

    原因:

      比如,基于form表单验证的基础是登录验证成功后,用户的信息存在缓存或数据库或cookie,无论哪种方式存储用户信息,都不能绕过对cookie的使用,所以form表单验证方法对于禁用cookie的浏览器都不能正常使用,结论就是不能使用cookie 的环境就不能使用基本的form表单验证方式。因此WEB API 由于跨域的使用,导致cookie不能正常工作,所以不能再使用基于表单验证的方式来实现。

    基于令牌TOKEN验证方法的实现:

    方法一:

         1. 实现对缓存TOKEN的管理,以防IIS服务器的宕机,可以对TOKEN进行持久化存储处理,每次IIS重启重新初始化已经登录成功TOKEN缓存。实现如下:

     View Code

         2. 新建ApiAuthorizeAttribute类,继承AuthorizeAttribute,重写方法IsAuthorized,这样基于TOKEN验证方式就完成了。实现如下:

     View Code

         3. 登录实现

     View Code

        4. 测试API

             这样就可以配合.NET原有的 AllowAnonymousAttribute 属性使用, 使用方法如下:
             不需要验证身份的 类或者Action 添加  [AllowAnonymous]属性,否则添加[ApiAuthorize]

    复制代码
     1     /// <summary>
     2     /// 测试
     3     /// </summary>
     4     [ApiAuthorize]
     5     public class TestController : BaseApiController
     6     {
     7         /// <summary>
     8         /// 测试权限1
     9         /// </summary>
    10         [HttpGet]
    11         public string TestAuthorize1()
    12         {
    13             return "TestAuthorize1";
    14         }
    15         /// <summary>
    16         /// 测试权限2
    17         /// </summary>
    18         [AllowAnonymous]
    19         [HttpGet]
    20         public string TestAuthorize2()
    21         {
    22             return "TestAuthorize2";
    23         }
    24     }
    复制代码

    测试一:

    复制代码
     1 //TestAuthorize
     2 function TestAuthorize1() {
     3     $.ajax({
     4         type: "get",
     5         url: host + "/mobileapi/test/TestAuthorize1",
     6         dataType: "text",
     7         data: {},
     8         beforeSend: function (request) {
     9             request.setRequestHeader("token", $("#token").val());  // 请求发起前在头部附加token
    10         },
    11         success: function (data) {
    12             alert(data);
    13         },
    14         error: function (x, y, z) {
    15             alert("报错无语");
    16         }
    17     });
    18 }
    复制代码

         结果如下:

    测试二:

    复制代码
     1 //TestAuthorize
     2 function TestAuthorize2() {
     3     $.ajax({
     4         type: "get",
     5         url: host + "/mobileapi/test/TestAuthorize2",
     6         dataType: "text",
     7         data: {},
     8         beforeSend: function (request) {
     9             request.setRequestHeader("token", $("#token").val());  // 请求发起前在头部附加token
    10         },
    11         success: function (data) {
    12             alert(data);
    13         },
    14         error: function (x, y, z) {
    15             alert("报错无语");
    16         }
    17     });
    18 }
    复制代码

        结果如下:

    测试三:

    复制代码
     1 //TestAuthorize
     2 function TestAuthorize1() {
     3     $.ajax({
     4         type: "get",
     5         url: host + "/mobileapi/test/TestAuthorize1",
     6         dataType: "text",
     7         data: {},
     8         beforeSend: function (request) {
     9             //request.setRequestHeader("token", $("#token").val());  // 请求发起前在头部附加token
    10         },
    11         success: function (data) {
    12             alert(data);
    13         },
    14         error: function (x, y, z) {
    15             alert("报错无语");
    16         }
    17     });
    18 }
    复制代码

         结果如下:

    测试四:

    复制代码
     1 //TestAuthorize
     2 function TestAuthorize2() {
     3     $.ajax({
     4         type: "get",
     5         url: host + "/mobileapi/test/TestAuthorize2",
     6         dataType: "text",
     7         data: {},
     8         beforeSend: function (request) {
     9             //request.setRequestHeader("token", $("#token").val());  // 请求发起前在头部附加token
    10         },
    11         success: function (data) {
    12             alert(data);
    13         },
    14         error: function (x, y, z) {
    15             alert("报错无语");
    16         }
    17     });
    18 }
    复制代码

        结果如下:


    方法二:

       此方法缺点就是每次请求都需要附带token请求参数,这对于有强迫症的程序猿来说是一种折磨,不细说,实现代码如下,有需要的自己研究研究:

     View Code

     

  • 相关阅读:
    C#学习教程
    数据库
    读写信号量
    qt配置tensorflow + opencv 提示protoc版本错误
    【1】EIGEN-Matrix类
    c++11的新特性
    ubuntu 16.04 python+tensorflow安装路径查看
    python的常用数据类型及其使用
    windows文件转LINUX文件格式
    ubuntu 16.04 + GPU 1080 + NVIDIA384
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5646895.html
Copyright © 2011-2022 走看看