Как сохранить токен сервера идентификации в локальной базе данных

#asp.net-mvc #identityserver4

#asp.net-mvc #identityserver4

Вопрос:

Я использую IdentityServer4 для настройки службы аутентификации для моего веб-приложения. Я уже настраиваю IdentityServer с помощью in MemoryStorage. Проблема, о которой я спрашивал себя, заключается в том, получил ли я токен от IdentityServer, а позже IdentityServer перезапускается, когда срок действия токена истек, identitySever может распознать токен и обновить его?

Если ответ второй, можете ли вы дать мне несколько идей о том, как это реализовать?

Ответ №1:

Вам нужно будет реализовать свой собственный IRefreshTokenStore и добавить его в свой DI-контейнер, например:

 // Add to DI
services.AddSingleton<IRefreshTokenStore , CustomRefreshTokenStore >();

// Create a new class that implements the IRefreshTokenStore
public class CustomRefreshTokenStore : IRefreshTokenStore
    {
        public Task<RefreshToken> GetRefreshTokenAsync(string refreshTokenHandle)
        {
            throw new NotImplementedException();
        }

        public Task RemoveRefreshTokenAsync(string refreshTokenHandle)
        {
            throw new NotImplementedException();
        }

        public Task RemoveRefreshTokensAsync(string subjectId, string clientId)
        {
            throw new NotImplementedException();
        }

        public Task<string> StoreRefreshTokenAsync(RefreshToken refreshToken)
        {
            throw new NotImplementedException();
        }

        public Task UpdateRefreshTokenAsync(string handle, RefreshToken refreshToken)
        {
            throw new NotImplementedException();
        }
    }
  

Комментарии:

1. Есть какой-нибудь пример реализации?

Ответ №2:

Интерфейс IIdentityServerBuilder имеет расширение, называемое AddOperationalStore.

Настройка и миграция базы данных описаны здесь:http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html

Вы можете использовать его как:

 var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

var isrvBuilder = services.AddIdentityServer();

isrvBuilder.AddOperationalStore(options =>
{
    options.ConfigureDbContext = builder =>
                builder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"),
                        sql => sql.MigrationsAssembly(migrationsAssembly));
                options.EnableTokenCleanup = true;
                options.TokenCleanupInterval = 30;
});