在哪里以及如何存储访问令牌和刷新令牌

5
我有一个基于dotnet core 2.2的MVC Web应用程序,它使用Web API执行一些数据库查询。我已经为Web API实现了基于JWT令牌的身份验证。令牌是在API上生成的,Web应用程序已收到访问令牌、过期时间和刷新令牌。我需要将这个令牌详细信息存储在我的客户端上,这样我就可以在令牌过期之前使用它来访问Web API,或者使用刷新令牌生成新的令牌。如有任何帮助,请告知。

令牌应该存储在cookie中,但请确保从服务器设置它。 - Shantanu
请问您能否解释一下这个? - Reshma
请看下面我的回答。 - Shantanu
4个回答

3

之前的答案没有清晰地解释为什么要使用这些解决方案。

典型的系统如下图所示,WEB中有两种常见的客户端应用程序架构:

  • 在浏览器中运行的单页应用程序
  • 服务器端MVC应用程序

OAuth system

在SPA的情况下,令牌存储在浏览器中(会话存储或本地存储),并在过期时由浏览器或应用程序自动清除。 请注意,由于安全原因,在SPA中无法获取刷新令牌。

在MVC应用程序的情况下(您的情况),事情变得更加复杂。 您有两个选择:将其存储在http-only cookie或某个外部会话存储中。 Aspnet core支持这两种情况,但每种情况都有缺点。 这里有一篇好文章。 简而言之,如果您担心cookie大小,则使用分布式会话存储,这会增加系统架构的复杂性。 否则,cookie是最简单的解决方案,并且在aspnet core中默认启用,您只需要设置options.StoreTokens = trueoptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme即可。


2
你有多种选择(安全的http-only cookie、本地存储、会话存储等)。
在最简单的情况下,你可以将它存储在cookie中,以便每个请求都会发送:
- cookie应始终具有HttpOnly标志,以防止浏览器中的XSS攻击。 - 在生产环境中,cookie还应使用Secure标志,以确保cookie仅通过HTTPS发送。 - 保护你的表单免受CSRF攻击(例如使用ASP.NET Core的AntiForgery功能)。
"Original Answer"翻译成"最初的回答"。

1

有多种存储令牌的方法。通常应用程序不会在任何地方存储访问令牌,但它们会在永久存储中存储刷新令牌。

让我们看看您需要在Web和API端存储什么。

首先,用户将使用凭据请求在Web应用程序中登录,Web应用程序将将此请求传递给与DB交互的API项目。

现在,API将生成访问令牌和刷新令牌,并将刷新令牌保存到该DB中。然后,Web API需要将访问令牌和刷新令牌存储在像Cookie或Session这样的临时存储中。

当访问令牌过期时,您需要调用新令牌,这将更新DB中的先前刷新令牌。

简而言之

刷新令牌-在DB中

访问令牌和刷新令牌-Web临时存储


是的,你是对的。现在我需要实现第二部分,即“访问令牌和刷新令牌 - Web 临时存储”。只有这样我才能发送访问令牌和刷新令牌以获取新令牌。 - Reshma
我有一个问题,如果我将访问令牌存储在数据库中,可能会存在哪些安全漏洞? - Noor A Shuvo
1
好问题!既然您考虑将访问令牌存储在数据库中,每次请求到来时都需要调用数据库进行用户验证,这将给系统增加额外的负载。@NoorAShuvo - Divyang Desai

-1

从 UI 到 Web 应用程序服务器(控制器)发起调用,该控制器反过来调用 API 来获取令牌。从 API 响应中获取令牌并将其存储在 cookie 中。

您的控制器应该类似于这样

var option = new CookieOptions
{
    Expires = DateTime.Now.AddMinutes(response.ExpiresIn)
};

if (!string.IsNullOrEmpty(domain))
{
                option.Domain = domain;
}

Response.Cookies.Append({cookiename}, response.AccessToken, option);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接