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

时间:2023-03-08 21:49:01

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缓存。实现如下:

 

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

3. 登录实现

4. 测试API

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

Web APIs 基于令牌TOKEN验证的实现
 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 }
Web APIs 基于令牌TOKEN验证的实现

测试一:

Web APIs 基于令牌TOKEN验证的实现
 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 }
Web APIs 基于令牌TOKEN验证的实现

结果如下:
Web APIs 基于令牌TOKEN验证的实现

测试二:

Web APIs 基于令牌TOKEN验证的实现
 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 }
Web APIs 基于令牌TOKEN验证的实现

结果如下:
Web APIs 基于令牌TOKEN验证的实现

测试三:

Web APIs 基于令牌TOKEN验证的实现
 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 }
Web APIs 基于令牌TOKEN验证的实现

结果如下:
Web APIs 基于令牌TOKEN验证的实现

测试四:

Web APIs 基于令牌TOKEN验证的实现
 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 }
Web APIs 基于令牌TOKEN验证的实现

结果如下:
Web APIs 基于令牌TOKEN验证的实现

方法二:

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