Asp.net core 2 AuthenticationProperties 存储 jwt token

标签 asp.net asp.net-mvc authentication oauth

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

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

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

示例如下:

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

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

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

最佳答案

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

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

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

.AddCookie("MyCookieScheme")

来自 SignInScheme 的文档注释:

Gets or sets the authentication scheme corresponding to the middleware responsible of persisting user's identity after a successful authentication. This value typically corresponds to a cookie middleware registered in the Startup class. When omitted, Microsoft.AspNetCore.Authentication.AuthenticationOptions.DefaultSignInScheme is used as a fallback value.

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

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

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

您可以研究解密 cookie 本身,看看里面有什么 - 请参阅此处的答案:How to manually decrypt an ASP.NET Core Authentication cookie?

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

关于Asp.net core 2 AuthenticationProperties 存储 jwt token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52560176/

相关文章:

java - 如何使用 JDBCRealm 获取登录用户的用户名?

asp.net - 我可以在 html 源代码中看到 ViewStateUserKey 吗?

asp.net - 没有收到微信关注回复

asp.net - 创建指向 Web 表单页面的链接并向其发送一些变量

c# - 如何使div可见和不可见

perl - 为什么我不能使用 Perl 的 AuthCAS 连接到我的 CAS 服务器?

java - Svn 身份验证用户名,密码使用 Svn Kit

javascript - 在 ASP 中调用 JavaScript 函数 :TEXTBOX

c# - 将重点放在自定义验证器上

asp.net-mvc - 如何在 ASP .NET MVC 中对参数进行 URL 编码