.NET Web API:为不同的用户设置不同的刷新令牌到期时间

Mik*_*e D 15 .net c# token jwt identityserver3

我正在使用Identity Server 3对我的角客户端进行身份验证并生成访问/刷新令牌.

我目前正在为我的Angular客户端设置刷新令牌在48小时后到期.

使用我的Angular应用程序的一些用户需要连续100天签名,而不必重新输入他们的凭据,是否可以仅为特定用户而不是整个客户端设置刷新令牌的到期时间?

我的数据库中有100个用户,我只希望一个特定用户在100天内不需要重新进行身份验证,而其他用户应该每48小时进行一次身份验证.

有点像:

if (user == "Super Man") {
    AbsoluteRefreshTokenLifetime = TimeSpan.FromDays(100.0).Seconds,
}
Run Code Online (Sandbox Code Playgroud)

这有可能实现吗?或者我是否仅限于为整个客户端设置刷新令牌过期?

谢谢

Rua*_*urg 5

我从未使用过IdentityServer3而且我没有测试下面的代码,但我认为这个概念可能有效.

当我看一下IdentityServer3的代码时,我可以看到在DefaultRefreshTokenService.CreateRefreshTokenAsync中设置了生命周期:

int lifetime;
if (client.RefreshTokenExpiration == TokenExpiration.Absolute)
{
    Logger.Debug("Setting an absolute lifetime: " + client.AbsoluteRefreshTokenLifetime);
    lifetime = client.AbsoluteRefreshTokenLifetime;
}
else
{
    Logger.Debug("Setting a sliding lifetime: " + client.SlidingRefreshTokenLifetime);
    lifetime = client.SlidingRefreshTokenLifetime;
}
Run Code Online (Sandbox Code Playgroud)

您不希望更改核心代码,但您应该能够使用自己的实现覆盖IRefreshTokenService.

当我从CustomUserService示例中获取代码作为示例时:

internal class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/core", coreApp =>
        {
            var factory = new IdentityServerServiceFactory()
                .UseInMemoryClients(Clients.Get())
                .UseInMemoryScopes(Scopes.Get());

            var refreshTokenService = new MyDefaultRefreshTokenService();

            // note: for the sample this registration is a singletone (not what you want in production probably)
            factory.RefreshTokenService = new Registration<IrefreshTokenService>(resolver => refreshTokenService);
Run Code Online (Sandbox Code Playgroud)

其中MyDefaultRefreshTokenService是DefaultRefreshTokenService的副本.

为了使其编译,添加一个IdentityModel(v1.13.1)的NuGet包并添加以下类:

using System;

namespace IdentityServer3.Core.Extensions
{
    internal static class DateTimeOffsetHelper
    {
        internal static Func<DateTimeOffset> UtcNowFunc = () => DateTimeOffset.UtcNow;

        internal static DateTimeOffset UtcNow
        {
            get
            {
                return UtcNowFunc();
            }
        }

        internal static int GetLifetimeInSeconds(this DateTimeOffset creationTime)
        {
            return (int)(UtcNow - creationTime).TotalSeconds;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在有一些关于事件的编译错误.您可以删除事件以测试代码.如果它有效,您可以随时选择添加它们.

现在为每个用户实现RefreshTokenLifetime.在您的RefreshTokenService版本中,您可以删除客户端代码并使用您自己的逻辑来确定每个用户的生命周期.

该主题可用,但我不知道它是否已包含足够的信息.但如果确实如此,则可以访问userManager以从商店中读取生命周期.或使用替代方法传递生命周期信息(也许您可以使用包含生命周期值的声明).

同样,我没有对此进行测试,但我认为这个概念应该有效.