我试图更好地理解jwt令牌是如何存储的(id、access、刷新)。添加OpenIdConnect时,可以设置的选项之一是保存令牌。在下面的配置中,每当用户登录时,都会生成jwt令牌(而不必单独调用授权端点来检索令牌)。
.AddOpenIdConnect("Test", options => {
options.SaveTokens = true;
}据我所读,它们保存在与AuthenticationProperties一起返回的ClaimsPrincipal集合中。您可以通过HttpContext.GetTokenAsync检索它们。
例子如下:
var accessToken = await HttpContext.GetTokenAsync("access_token");我试图更多地了解这些值是如何存储和检索的。我知道声明是与用户关联的身份/声明的集合。但是,身份验证属性究竟是如何设置的呢?如何单独访问身份验证属性的集合?是否有可以直接访问类属性的类/接口?在ClaimsPrincial类中,我没有看到任何关于身份验证属性的内容。
另外,由于访问令牌存储在身份验证属性中,更新值的唯一方法是重新验证(即挑战用户再次登录)吗?如何更新该值?还是提取值存储在其他地方进行更新会更好呢?
发布于 2018-11-22 02:37:14
我自己也一直在调查这件事。OpenID连接中间件似乎通常通过SignInScheme选项指定的第二个cookie身份验证方案将数据持久化到签名cookie中。使用显式配置的示例扩展以前的示例:
.AddOpenIdConnect("Test", options => {
options.SignInScheme = "MyCookieScheme";
options.SaveTokens = true;
}此示例意味着还使用如下调用设置了cookie身份验证方案:
.AddCookie("MyCookieScheme")来自SignInScheme上的文档注释:
获取或设置与成功身份验证后负责持久化用户身份的中间件对应的身份验证方案。此值通常对应于在启动类中注册的cookie中间件。省略时,Microsoft.AspNetCore.Authentication.AuthenticationOptions.DefaultSignInScheme用作回退值。
(请注意,该属性实际上来自于RemoteAuthenticationOptions类,OpenIdConnectOptions对其进行了扩展)
在没有显式提供cookie身份验证方案的默认设置场景中,跟踪发生了什么是有点棘手的,但我认为它在默认情况下设置了一个,或者依赖于其中的一个。此外,我猜想理论上,任何其他类型的身份验证方案都可以用于这种持久性(例如,您自己的JWT发布和签名方案),但我没有看到任何这样的例子。
至于实际存储在cookie中的内容以及OpenID连接中间件如何将其放在cookie中,您可能需要对所有代码进行大量的挖掘才能确定--所有这些低级中间件的细节似乎还没有得到太多的文档记录。我所确信的是,DataProtection中间件参与了cookie内容的加密。
您可以查看如何解密cookie本身,以查看其中的内容--参见这里的答案:如何手动解密ASP.NET核心身份验证cookie?
(哦,为了记录在案,所有这些示例都是基于ASP.NET Corev2.0的)
发布于 2021-09-04 12:59:52
另一种选择是使用TokenValidationParameters.SaveSigninToken
来自源代码
if (validationParameters.SaveSigninToken)
identity.BootstrapContext = jwtToken.RawData;它将将原始令牌存储在当前标识的BoostrapContext属性中。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication()
.AddJwtBearer(options =>
{
options.TokenValidationParameters.SaveSigninToken = true;
});
}
}然后访问当前用户的标识。
((ClaimsIdentity)this.User.Identity).BoostrapContext // => original JWT tokenhttps://stackoverflow.com/questions/52560176
复制相似问题