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

时间:2019-06-11 11:20:28

标签: asp.net-core-mvc jwt token

我有一个dotnet核心2.2 MVC Web应用程序,该应用程序使用Web api来执行一些数据库查询。我已经为Web api实现了基于JWT令牌的认证。令牌是在api上生成的,并且Web应用程序已接收到访问令牌,到期和刷新令牌。我需要将此令牌详细信息存储在我的客户端,以便我可以使用它访问Web api(在到期前),或者如果令牌过期,则可以使用刷新令牌生成新令牌。

任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分:1)

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

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

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

现在,api将生成访问令牌和刷新令牌,并将刷新令牌保存到该数据库。然后,Web api需要将访问令牌和刷新令牌存储在cookie或会话等临时存储中。

访问令牌过期时;您需要调用一个新令牌,这将更新数据库中以前的刷新令牌。

TL; DR

刷新令牌-在数据库中

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

答案 1 :(得分:1)

先前的答案并未提供使用这些解决方案的原因的明确解释。

典型系统如下图所示,WEB中使用两种常见的 Client Application 体系结构:

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

OAuth system

对于SPA,令牌存储在浏览器(会话存储或本地存储)中,并在到期时由浏览器或应用本身自动清除。 仅供参考,由于安全原因,无法在SPA中获取刷新令牌。

对于MVC应用程序(您的情况),情况变得更加复杂。您有两种选择:将其存储在仅HTTP cookie或某些外部会话存储中。 Aspnet核心支持这两种情况,但每种情况都有警告。 A good article here。简而言之,如果您担心Cookie的大小,请使用 Distributed Session Storage ,这会增加系统架构的复杂性。否则,cookies是最简单的解决方案,并且默认情况下在aspnet核心中启用了cookie,您只需要设置options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme<?PHP namespace App\Http\Middleware; use Closure; use Auth; use Cache; use Carbon\Carbon; class LastUserActivity { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if(Auth::check()){ $expiresAt = Carbon::now()->addMinutes(1); Cache::put('user-is-online-'.Auth::user()->id, true, $expiresAt); } return $next($request); } }

答案 2 :(得分:0)

进行从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);

答案 3 :(得分:0)

您有多种选择(安全的仅HTTP cookie,本地存储,会话存储等)。

在最简单的情况下,您可以将其存储在cookie中,以便随每个请求一起发送:

  • cookie应当始终带有HttpOnly标志,以防止浏览器中的XSS攻击。
  • 该cookie还应在生产环境中使用Secure标志,以确保该cookie仅通过HTTPS发送。
  • 保护表单免受CSRF攻击(例如,使用ASP.NET Core的AntiForgery功能)。