【问题标题】:OpenIddict Refresh Token Flow issue ASP.NET CoreOpenIddict 刷新令牌流问题 ASP.NET Core
【发布时间】:2017-06-30 19:20:57
【问题描述】:

我正在尝试将我的刷新令牌生命周期设置为 2 周。我试过通过.. FromSeconds、FromMinutes、FromHours,但它总是将刷新令牌设置为与访问令牌相同的生命周期。我将不胜感激任何帮助。这是我目前在 configureServices 中的内容:

services.AddOpenIddict(options =>
{
    // Register the Entity Framework stores.
    options.AddEntityFrameworkCoreStores<AppDbContext>();

    // Register the ASP.NET Core MVC binder used by OpenIddict.
    // Note: if you don't call this method, you won't be able to
    // bind OpenIdConnectRequest or OpenIdConnectResponse parameters.
    options.AddMvcBinders();

    // Enable the token endpoint.
    options.EnableTokenEndpoint("/connect/token");

    // Enable the password flow.
    options.AllowPasswordFlow()
            .AllowRefreshTokenFlow()
            .SetAccessTokenLifetime(TimeSpan.FromMinutes(1))
            .SetRefreshTokenLifetime(TimeSpan.FromMinutes(20160));

    // During development, you can disable the HTTPS requirement.
    options.DisableHttpsRequirement();
});

【问题讨论】:

  • but it always sets the refresh token to the same lifetime as the access token -> 你是怎么得出这个结论的?
  • 这是我得到的 400 的正文:{"error":"invalid_grant","error_description":"刷新令牌不再有效。"}。它设置为 14 天,但一旦访问令牌不再有效,无论我设置多远,刷新令牌也是如此。
  • 值得注意的是,刷新令牌是一次性令牌(除非您禁用滑动到期)。您确定这不是导致您看到的错误的原因吗?

标签: asp.net-core openiddict


【解决方案1】:

请注意:以下帖子无法解决问题: http://kosmisch.net/Blog/DotNetEssential/Archive/2017/9/11/openiddict-refresh-token-flow-issue-aspnet-core-20.html

关于该问题的最新摘要: 使用用户名和密码登录时,openiddicttoken 表中插入以下数据:

Id  ApplicationId   AuthorizationId Ciphertext  End Hash    Start   Status  Subject Type

1 NULL NULL NULL 2017-10-12 11:24:26.0000000 +00:00 NULL 2017-09-12 11:24:26.0000000 +00:00 有效 1 个 refresh_token

然后完成了一个 refresh_token 授权类型请求。 上面的记录更新了,只有状态栏的变化,从valid变成了redeemed

Id  ApplicationId   AuthorizationId Ciphertext  End Hash    Start   Status  Subject Type

1 NULL NULL NULL 2017-10-12 11:24:26.0000000 +00:00 NULL 2017-09-12 11:24:26.0000000 +00:00 兑换了 1 个 refresh_token

响应 JSON 不包含新的刷新令牌属性。

我认为对于第二次刷新,我认为至少 Start 或 End 列中的一个应该更改,因为我配置为使用滑动到期。

但事实并非如此。所以我认为这种刷新令牌方法可能存在一个问题。你能看看吗?

在示例中:https://github.com/openiddict/openiddict-samples/tree/dev/samples/RefreshFlow

我下载了,每次刷新都可以看到会插入一个新的token,这和我之前的行为很不一样。顺便说一句,我已经更改了示例代码以使用幻灯片过期。

主要区别是我的模型使用 int 作为 TKey,而示例使用 GUID。所以我想知道这是否与此有关?

options.UseOpenIddict<int>();

找出我的问题的根本原因:

 // Create a new authentication ticket holding the user identity.
        var ticket = new AuthenticationTicket(principal, *new AuthenticationProperties(),* OpenIdConnectServerDefaults.AuthenticationScheme);

虽然应该是:

// Create a new authentication ticket holding the user identity.
        var ticket = new AuthenticationTicket(principal, properties, OpenIdConnectServerDefaults.AuthenticationScheme);

【讨论】:

  • 我非常怀疑将SaveToken 设置为true 会“解决”您的问题,因为它的唯一作用是将访问令牌作为身份验证属性保留,以便您可以从自己的代码轻松访问它。如果你看一下the source code,你会发现它默认是启用的,所以强制true值不会有任何效果。
  • 如果您看到从您自己的代码返回的 The refresh token is no longer valid 错误,这可能意味着 Identity 无法检索与存储在刷新令牌中的用户 ID 对应的用户配置文件,当您删除数据库中的用户。这能解释你的问题吗?
  • 是的,你对那个属性是正确的。用户始终在数据库中,我从未将其删除。在我添加了该代码之后,它现在一直在工作。然而,当我更新代码时,OpenIdDict 包刚刚更新到 2.0 候选发布版本。我认为更新之前的代码中可能存在错误。所以我们可能会探索更多一点。
  • @michael 您能否尝试刷新您的 OpenIdDict 包,看看问题是否仍然存在?昨晚有一些更新。
  • RC1 中未修复任何错误。您确定您已正确配置数据保护 (docs.microsoft.com/en-us/aspnet/core/security/data-protection)?其他问题来源可能包括存储刷新令牌元数据的数据库问题。
猜你喜欢
  • 2021-06-02
  • 2017-05-09
  • 2018-03-30
  • 2018-03-22
  • 2017-07-01
  • 2020-01-09
  • 2021-08-23
  • 2020-07-06
  • 2019-03-12
相关资源
最近更新 更多