在 ASP.NET 客户端 Web 应用程序上存储访问和刷新令牌的位置 - 调用 REST API

信息安全 oauth 令牌 asp.net-mvc api
2021-09-03 19:12:29

我在 ASP.NET 中创建了一个 Web API,它充当 SQL Server 数据库中报告数据的入口点。该服务有一个“令牌”端点,它通过 ASP 身份验证用户并返回 20 分钟访问和 2 周刷新令牌。

此 API 只能通过我们自己的应用程序和产品访问。我们将编写一个 Android 应用程序、iOS 应用程序和 ASP.NET Web 应用程序,它们将通过上述 Web API 进行身份验证并从中获取数据。我将负责 ASP.NET 客户端 Web 应用程序和 API。我们正在内部构建这些应用程序,供我们的客户登录和使用。我公司以外的任何第三方都不会通过他们自己的任何应用程序调用我们的 API。

对于我的客户端 ASP.NET Web 应用程序,我在 ASP.NET MVC 中编写它,它现在还没有真正的数据库,因为它与 API 进行通信。

我已经开始以此为基础,并且它可以工作......但现在我需要将此 HTML 文件转换为 MVC 中的 ASP.NET Web 应用程序,并找出存储访问令牌和刷新令牌的位置和方式。http://blog.rfaisal.com/2014/01/14/building-your-own-api-and-securing-it-with-oauth-2-0-in-asp-net-webapi-2 /

我的问题是:

  1. 我知道我需要在后续调用 API 中传递访问令牌来执行 CRUD 操作。登录时,我应该在哪里发出我的 Web 请求以验证 Web 应用程序上的用户......从后面的 C# 代码或 JavaScript 中引用的教程?我问是因为我意识到在我的 JS Ajax 调用中我需要访问令牌,但我听说刷新令牌需要更“安全”,并且从服务器代码调用可能会给我更安全的选项这样做??

  2. 我在哪里存储访问令牌?在 JavaScript 或服务器中创建的 cookie 中?在 JavaScript 本地存储中?在我可以传递给 JavaScript 的会话变量中,也许?

  3. 我在哪里存储刷新令牌?在访问令牌即将到期之前,我需要它来更新它。我已经用谷歌搜索了这个,但找不到一个好的 ASP.NET 在线解决方案,它可以从我的消费网络应用程序的角度告诉我在哪里或如何存储它。从服务器创建的 cookie,保存在 Web 应用程序使用的 SQL DB 中,在会话变量中?

我迫切需要帮助,这让我发疯,让我夜不能寐。希望有人能提供一个完整、简单的例子,并充分描述我需要做什么。

1个回答

1. 在哪里认证用户?

如果是需要进行身份验证的用户,那么您的前端需要一些东西。从您的前端,您可以使用用户凭据对后端进行 POST。您验证用户凭据,并发出一个 accesstoken/refreshtoken 对,以防凭据已知。您将始终必须通过后端对用户进行身份验证。您提到本教程在 JS 中执行此操作,但事实并非如此。它发布到登录表单。POST 是在 JS 中发起的,但它会进入后端。

2. 我在哪里存储访问令牌?

访问令牌的存储方式与普通身份验证 cookie 的存储方式相同。您有多种选择(安全的 http-only cookie、本地存储、会话存储等)。在最简单的场景中,您只需将其存储在 cookie 中,以便与每个请求一起发送。但是,对于移动应用程序,将其存储在 LocalStorage 中可能更容易。

3. 我在哪里存储刷新令牌?

这在很大程度上取决于您的应用程序。我前段时间问过同样的问题,关于移动应用程序(请务必阅读评论)。您应该将刷新令牌存储在安全的地方。对于您将开发的应用程序,您可以按照我链接到的答案中的建议进行操作,即:

  • 将 refreshtoken 存储在 LocalStorage 中
  • 使用 Android/IOS 提供的 API 将加密的刷新令牌存储在文件系统的某个位置。将加密密钥存储在本地存储中。(或相反)。

对于其他类型的应用程序,存在其他可能性。从安全角度来看,将 accesstoken 和 refreshtoken 同时存储在 LocalStorage 中可能会让人感觉不对,但攻击者在令牌传输过程中截获令牌可能比获得对本地存储的访问权更幸运。这里给出了其他一些有时更奇特的建议(例如 IOS 安全存储)。

额外的信息

  • 我个人非常喜欢这一系列的博文请注意,它们可能开始变得有点过时,但它们包含大量有关 REST-OWIN 设置的信息。
  • 请不要忘记实施所有其他安全控制,我没有提到,因为这会使答案变得模糊。应该实施 HTTPS、http-only cookie、安全 cookie、XSS 预防等,否则您的令牌将比您阅读此答案所需的时间快得多。