首页 > 解决方案 > Bearer 令牌如何在使用 Asp.net MVC 5 的基于令牌的身份验证中工作?

问题描述

我尝试了与此网站链接相同的基于令牌的身份验证。

它对我来说很好。但我有两个问题

  1. 添加以下代码后,它会检查来自客户端的每个请求并验证用户。如果成功,它会返回一些数据,如果没有,它会显示unauthorize

    但问题是,在我登录后(http://localhost:49501/Home),它只在同一个浏览器选项卡http://localhost:49501/Home/Data )上显示成功

    但是在我登录(Tab1)并尝试访问相同的网址(http://localhost:49501/Home/Data)但在另一个具有相同 Chrome 浏览器的选项卡(tab2)上时,它显示未授权错误

数据.cshtml

 var  authHeaders = {};
 authHeaders.Authorization = 'Bearer ' + sessionStorage.setItem('accessToken');

 $.ajax({
     url: "http://localhost:49501/api/values",
     type: "GET",
     headers: authHeaders,
     success: function (response) {
         console.log('Success');
     }
 });
  1. 使用 AJAX 发送令牌真的安全吗?因为所有代码都出现在客户端。

标签: ajaxauthenticationasp.net-web-apimodel-view-controllerasp.net-web-api2

解决方案


  1. 我可以在您的代码中看到一个问题:

    authHeaders.Authorization = 'Bearer ' + sessionStorage.setItem('accessToken');

sessionStorage.setItem方法有两个强制参数&没有它会报错,执行时开发者控制台下面肯定有一些js错误。sessionStorage 的正确用法是:

// Save data to sessionStorage
sessionStorage.setItem('key', 'value');

// Get saved data from sessionStorage
let data = sessionStorage.getItem('key');

// Remove saved data from sessionStorage
sessionStorage.removeItem('key');

// Remove all saved data from sessionStorage
sessionStorage.clear();
  1. 回答您的第二个问题“使用 AJAX 发送令牌真的安全吗?因为所有代码都出现在客户端。”

这个想法是使用在有限时间内有效的用户凭据在服务器上生成一些 accessToken。优点是您可以使用 authToken 授权后续请求,直到它有效,并且您无需存储真实的用户名和密码来授权每个请求。此外,如果会话处于活动状态更长时间,还可以通过添加一些机制来刷新安全令牌,您可以防止用户注销/重新授权请求。

为了消除安全问题,真实用户凭据不会被保存,并且身份验证令牌的时间有效性是有限的。例如,如果您的安全令牌的有效期为 30 分钟,如果用户在非活动会话 30 分钟后离开机器,则无法使用此令牌。

您还可以在会话中每隔几分钟重新生成安全令牌并在后台更新会话存储以进一步安全。如果机器是私有的,将它们保存在本地机器上也不是那么不安全,但对于公共机器,我们也可以确保在注销/超时时清除任何会话存储,如果保持原样,那么令牌也会在一段时间后过期。

希望能帮助到你


推荐阅读