OpenIddict刷新令牌流问题ASP.NET核心

时间:2017-06-30 19:20:57

标签: asp.net-core openiddict

我正在尝试将刷新令牌的生命周期设置为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();
});

1 个答案:

答案 0 :(得分:0)

请注意:以下帖子无法解决问题: 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授权类型请求。 上述记录已更新,只有更改是状态列,已从有效更改为已兑换

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

我下载了,每次刷新完成时都可以看到,会插入一个新的令牌,这与我的行为非常不同。顺便说一句,我已经更改了示例代码以使用幻灯片过期。

主要区别在于我的模型使用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);