IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储

Posted

技术标签:

【中文标题】IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储【英文标题】:IdentityServer4 - Refresh Tokens Hybrid Flow - Cookies and storage 【发布时间】:2020-02-14 12:17:53 【问题描述】:

我已关注 Quickstart Hybrid Flow here,但我需要一些有关在使用刷新令牌后保存令牌的帮助和建议。

如果我说的是真的,选项 SaveTokens 允许将令牌保存在 cookie 中。

首先,将访问和刷新令牌存储在 cookie 中是否是个好主意(关于安全性的担忧)?

其他问题,我通过代码正确检索刷新令牌 var refreshToken = await HttpContext.GetTokenAsync("refresh_token"); 但是现在,当我获得新的访问令牌时,我该如何存储它(没有 SetTokenAsync 方法)?...因为没有它,当我调用 var refreshToken = await HttpContext.GetTokenAsync("access_token"); 时我会检索旧的访问令牌而我想得到新的。

谢谢

【问题讨论】:

看一下我的回答here的信息。 谢谢,它帮助我在使用刷新令牌后保存令牌(访问和刷新)。您对将它们保存在 cookie 中(安全与否)有什么看法……在这个流程中使用 PKCE 有用吗? 【参考方案1】:

来自documentation:

交互式客户端应使用基于授权码的流程。到 防止代码替换,无论是混合流还是 PKCE 都应该 使用。

因此,PKCE 和混合流的组合是不必要的,而且可能没有用。

如果 PKCE 可用,这是解决问题的更简单的方法。

PKCE 已经是原生应用的官方推荐 和 SPA - 并且默认情况下也会发布 ASP.NET Core 3 OpenID Connect 处理程序也支持。

所以不要使用混合流,而是将其配置为interactive ASP.NET Core MVC client。

new Client

    ClientId = "mvc",
    ClientSecrets =  new Secret("secret".Sha256()) ,

    AllowedGrantTypes = GrantTypes.Code,
    RequireConsent = false,
    RequirePkce = true,

    // where to redirect to after login
    RedirectUris =  "http://localhost:5002/signin-oidc" ,

    // where to redirect to after logout
    PostLogoutRedirectUris =  "http://localhost:5002/signout-callback-oidc" ,

    AllowedScopes = new List<string>
    
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile
    

mvc 客户端具有预期配置的地方:

.AddOpenIdConnect("oidc", options =>

    options.Authority = "http://localhost:5000";
    options.RequireHttpsMetadata = false;

    options.ClientId = "mvc";
    options.ClientSecret = "secret";
    options.ResponseType = "code";

    options.SaveTokens = true;
);

我还可以推荐 Brock Allen 的 this post。这可能会回答您关于 cookie 的问题。也可以查看Dominick Baier的the post。

有关如何使用刷新令牌的信息,请阅读my answer here。

【讨论】:

以上是关于IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer4示例之切换到混合流并且添加API访问

IdentityServer4 参考访问令牌有时作为 JWT 令牌传输

IdentityServer4 刷新令牌为空

如何测试我的令牌是不是使用 IdentityServer4 刷新?

IdentityServer4 如何在授权代码流中存储和更新令牌

带有存储在 cookie 中的刷新令牌的 SPA - 如何使用 IdentityServer4 进行配置?