我试图更好地了解jwt令牌的存储方式(id,访问权限,刷新)。添加OpenIdConnect时,可以设置的选项之一是保存令牌。通过以下配置,每当用户登录时,都会生成jwt令牌(无需调用授权端点来单独检索令牌)。
.AddOpenIdConnect("Test", options => {
options.SaveTokens = true;
}
根据我的阅读,它们与ClaimsPrincipal一起保存在AuthenticationProperties集合中。您可以通过HttpContext.GetTokenAsync检索它们。
以下示例:
var accessToken = await HttpContext.GetTokenAsync("access_token");
我试图更多地了解如何存储和检索这些值。我知道Claimsprincial是与用户相关联的身份/声明的集合。但是究竟如何设置身份验证属性?如何分别访问身份验证属性的集合?是否可以使用类/接口直接访问类属性?在ClaimsPrincial类中没有看到有关身份验证属性的任何信息。
此外,由于访问令牌存储在身份验证属性中,因此更新值的唯一方法是重新进行身份验证(即要求用户再次登录)吗?如何更新值?还是最好提取出将值存储在其他地方以进行更新?
答案 0 :(得分:1)
我也一直在自己研究这个问题。 OpenID Connect中间件似乎通常是通过SignInScheme选项指定的第二种cookie身份验证方案将数据持久保存到已签名的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本身以了解其中的内容-在此处查看答案:How to manually decrypt an ASP.NET Core Authentication cookie?
(哦,为了便于记录,所有这些示例均基于ASP.NET Core v2.0)