首页 > 解决方案 > IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储

问题描述

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

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

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

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

谢谢

标签: .netsecurityidentityserver4access-tokenrefresh-token

解决方案


文档中:

交互式客户端应使用基于授权代码的流程。为了防止代码替换,应使用混合流或 PKCE。

因此,PKCE 和混合流的组合不是必需的,也可能没有用。

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

PKCE 已经是本机应用程序和 SPA 的官方推荐 - 随着 ASP.NET Core 3 的发布,OpenID Connect 处理程序也默认支持。

因此,不要使用混合流,而是将其配置为交互式 ASP.NET Core MVC 客户端

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的这篇文章。这可能会回答您关于 cookie 的问题。你也可以查看Dominick Baier的帖子

有关如何使用刷新令牌的信息,请在此处阅读我的回答


推荐阅读