Asp.net core 2 AuthenticationProperties 存储 jwt 令牌

Hel*_*123 5 asp.net authentication asp.net-mvc oauth

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

.AddOpenIdConnect("Test", options => {  
                options.SaveTokens = true;
}
Run Code Online (Sandbox Code Playgroud)

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

下面的例子:

var accessToken = await HttpContext.GetTokenAsync("access_token");
Run Code Online (Sandbox Code Playgroud)

我试图更多地了解这些值是如何存储和检索的。我知道 Claimsprincial 是与用户相关的身份/声明的集合。但身份验证属性到底是如何设置的呢?如何单独访问身份验证属性的集合?是否有一个类/接口可以用来直接访问类属性?我在 ClaimsPrincial 类中没有看到任何有关身份验证属性的内容。

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

nuc*_*eon 3

我自己也对此进行了一些研究。OpenID Connect 中间件似乎通常通过由 SignInScheme 选项指定的第二个 cookie 身份验证方案将数据持久保存到签名 cookie 中。使用显式配置的示例扩展之前的示例:

.AddOpenIdConnect("Test", options => {  
    options.SignInScheme = "MyCookieScheme";
    options.SaveTokens = true;
}
Run Code Online (Sandbox Code Playgroud)

此示例意味着还通过如下调用设置了 cookie 身份验证方案:

.AddCookie("MyCookieScheme")
Run Code Online (Sandbox Code Playgroud)

来自 SignInScheme 的文档注释:

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

(请注意,该属性实际上来自扩展RemoteAuthenticationOptions的类OpenIdConnectOptions

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

至于 cookie 中实际存储的内容以及 OpenID Connect 中间件如何将其放置在那里,您可能需要对所有代码进行大量挖掘才能确定 - 所有这些低级的细节 - level 中间件似乎还没有太多文档记录。我唯一确定的是 DataProtection 中间件参与加密 cookie 的内容。

您可以研究解密 cookie 本身,看看里面有什么 - 请参阅此处的答案:如何手动解密 ASP.NET Core 身份验证 cookie?

(哦,郑重声明,所有这些示例均基于 ASP.NET Core v2.0)

  • 感谢分享。我想知道当设置 SaveToken=True 时,令牌保存在哪里??? (2认同)
  • 知道如何使用refresh_token刷新access_token并将新的access_token存储回身份验证cookie中吗? (2认同)