之前的答案没有清晰地解释为什么要使用这些解决方案。
典型的系统如下图所示,WEB中有两种常见的客户端应用程序架构:
在SPA的情况下,令牌存储在浏览器中(会话存储或本地存储),并在过期时由浏览器或应用程序自动清除。 请注意,由于安全原因,在SPA中无法获取刷新令牌。
在MVC应用程序的情况下(您的情况),事情变得更加复杂。 您有两个选择:将其存储在http-only cookie或某个外部会话存储中。 Aspnet core支持这两种情况,但每种情况都有缺点。 这里有一篇好文章。 简而言之,如果您担心cookie大小,则使用分布式会话存储,这会增加系统架构的复杂性。 否则,cookie是最简单的解决方案,并且在aspnet core中默认启用,您只需要设置options.StoreTokens = true
和options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme
即可。
有多种存储令牌的方法。通常应用程序不会在任何地方存储访问令牌,但它们会在永久存储中存储刷新令牌。
让我们看看您需要在Web和API端存储什么。
首先,用户将使用凭据请求在Web应用程序中登录,Web应用程序将将此请求传递给与DB交互的API项目。
现在,API将生成访问令牌和刷新令牌,并将刷新令牌保存到该DB中。然后,Web API需要将访问令牌和刷新令牌存储在像Cookie或Session这样的临时存储中。
当访问令牌过期时,您需要调用新令牌,这将更新DB中的先前刷新令牌。
简而言之
刷新令牌-在DB中
访问令牌和刷新令牌-Web临时存储
从 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);