Asp.net core 2身份验证属性存储jwt令牌

5

我试图更好地了解jwt令牌是如何存储(id、访问和刷新)。当您添加OpenIdConnect时,您可以设置保存令牌的选项。使用以下配置,每当用户登录时,jwt令牌就会生成(无需单独调用授权端点来检索令牌)。

.AddOpenIdConnect("Test", options => {  
                options.SaveTokens = true;
}

据我所了解,它们保存在与ClaimsPrincipal一起返回的AuthenticationProperties集合中。您可以通过HttpContext.GetTokenAsync检索它们。

以下是示例:

var accessToken = await HttpContext.GetTokenAsync("access_token");

我试图更好地理解这些值是如何存储和检索的。我知道ClaimsPrincipal是与用户相关的标识/声明集合,但是身份验证属性是如何设置的呢?我如何单独访问身份验证属性的集合?是否有类/接口可以用来直接访问该类的属性?在ClaimsPrincipal类中没有找到任何有关身份验证属性的信息。

另外,由于访问令牌存储在身份验证属性中,更新值的唯一方法是重新认证(即要求用户再次登录)吗?我该如何更新值?还是最好提取该值并将其存储在其他位置以进行更新?

2个回答

3

我也一直在研究这个问题。OpenID Connect中间件通常通过第二个cookie认证方案,由SignInScheme选项指定,将数据持久化到签名cookie中。通过显式配置示例来扩展您之前的示例:

.AddOpenIdConnect("Test", options => {  
    options.SignInScheme = "MyCookieScheme";
    options.SaveTokens = true;
}

这个例子暗示着已经设置了一个cookie身份验证方案,类似于这样的调用:
.AddCookie("MyCookieScheme")

从SignInScheme的文档注释中可以得知:

获取或设置与负责在成功验证后持久化用户身份的中间件对应的身份验证方案。该值通常对应于在Startup类中注册的cookie中间件。当省略时,将使用Microsoft.AspNetCore.Authentication.AuthenticationOptions.DefaultSignInScheme作为回退值。

(注意,此属性实际上来自于一个RemoteAuthenticationOptions类,而OpenIdConnectOptions是其扩展)

跟踪默认设置场景中发生的事情,如果您没有明确指定cookie身份验证方案,有点棘手,但我想它会默认设置一个或者依赖于已经存在一个。此外,我想理论上任何其他类型的身份验证方案都可以用于这种持久性(例如您自己的JWT发布和签名方案),但我没有看到任何此类示例。

至于实际存储在cookie中的内容以及OpenID Connect中间件如何将其放置在其中,您可能需要通过所有代码进行大量挖掘才能确定-所有这些低级中间件的具体细节似乎尚未被充分记录。我所知道的唯一确定的是,DataProtection中间件参与加密cookie的内容。

您可以尝试解密cookie本身以查看其中的内容-请参见此处的答案:如何手动解密ASP.NET Core身份验证cookie?

(哦,还有,所有这些示例都基于ASP.NET Core v2.0)


谢谢。这对我帮助很大。我稍微研究了一下,就像你说的那样,框架基本上为您完成了所有繁重的工作(将JWT存储在安全cookie中)。最简单的刷新方法是重新发出挑战,以便用户被迫再次登录(如果会话过期),或者根据身份验证源(我使用的是Auth0)无需登录即可无缝重新认证。我需要大量阅读此方面的内容,因为身份验证是一个非常复杂的主题,我不想搞砸它! - Help123
2
谢谢分享。我想知道当设置SaveToken=True时,token保存在哪里??? - Franva
2
有没有想法如何使用refresh_token刷新access_token并将新的access_token存储回身份验证cookie中? - Harindaka

0

另一个选择是使用 TokenValidationParameters.SaveSigninToken

来自 源代码

if (validationParameters.SaveSigninToken)
     identity.BootstrapContext = jwtToken.RawData;

它将把原始令牌存储在当前身份的{{link1:BoostrapContext}}属性中。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication()
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters.SaveSigninToken = true;
                });
    }
}

然后访问当前用户的身份

 ((ClaimsIdentity)this.User.Identity).BoostrapContext // => original JWT token

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