我有一个dotnet核心2.2 MVC Web应用程序,该应用程序使用Web api来执行一些数据库查询。我已经为Web api实现了基于JWT令牌的认证。令牌是在api上生成的,并且Web应用程序已接收到访问令牌,到期和刷新令牌。我需要将此令牌详细信息存储在我的客户端,以便我可以使用它访问Web api(在到期前),或者如果令牌过期,则可以使用刷新令牌生成新令牌。
任何帮助,将不胜感激。
答案 0 :(得分:1)
有多种存储令牌的方法。通常,应用程序不会在任何地方存储访问令牌,但是会将刷新令牌存储在永久存储区中。
让我们看看您需要在Web和api端存储什么。
首先,用户将请求使用凭据登录Web应用程序,Web应用程序会将此请求传递给api项目-与DB交互。
现在,api将生成访问令牌和刷新令牌,并将刷新令牌保存到该数据库。然后,Web api需要将访问令牌和刷新令牌存储在cookie或会话等临时存储中。
访问令牌过期时;您需要调用一个新令牌,这将更新数据库中以前的刷新令牌。
TL; DR
刷新令牌-在数据库中
访问令牌和刷新令牌-网络临时存储
答案 1 :(得分:1)
先前的答案并未提供使用这些解决方案的原因的明确解释。
典型系统如下图所示,WEB中使用两种常见的 Client Application 体系结构:
对于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中,以便随每个请求一起发送:
HttpOnly
标志,以防止浏览器中的XSS攻击。Secure
标志,以确保该cookie仅通过HTTPS发送。