Identity Server 4 AddOidcStateDataFormatterCache не применяется к AddGoogle - PullRequest
0 голосов
/ 10 июля 2019

При использовании метода AddOidcStateDataFormatterCache с помощью:

services.AddOidcStateDataFormatterCache();

Это применимо только к провайдерам, которые добавляются с помощью

.AddOpenIdConnect();

. Есть ли способ применить распределенный кэш при использовании

.AddGoogle() 

Google также является провайдером OpenId и может быть добавлен с помощью .AddOpenIdConnect или .AddGoogle, но с использованием .AddGoogle не использует средство форматирования данных состояния.Я подтвердил это, проверив кэш redis (используемый в качестве базовой реализации IDistributedCache) и увидел ключ, созданный «DistributedCacheStateDataFormatter ...» при использовании .AddOpenIdConnect, но при использовании .AddGoogle ничего не создается.

I 'Я думаю, это может быть связано с тем, что .AddGoogle может использовать другой обработчик аутентификации, который не запускается автоматически AddOidcStateDataFormatterCache

1 Ответ

1 голос
/ 10 июля 2019

Это потому, что класс GoogleOptions наследуется от OAuthOptions, а не OpenIdConnectOptions, но у них обоих есть ISecureDataFormat<AuthenticationProperties> StateDataFormat, поэтому вы можете повторно использовать DistributedCacheStateDataFormatter, предоставленный identityserver4

Класс постконфигурации:

internal class ConfigureGoogleOptions : IPostConfigureOptions<GoogleOptions>
{
    private string[] _schemes;
    private readonly IHttpContextAccessor _httpContextAccessor;

    public ConfigureGoogleOptions(string[] schemes, IHttpContextAccessor httpContextAccessor)
    {
        _schemes = schemes ?? throw new ArgumentNullException(nameof(schemes));
        _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
    }

    public void PostConfigure(string name, GoogleOptions options)
    {
        // no schemes means configure them all
        if (_schemes.Length == 0 || _schemes.Contains(name))
        {
            options.StateDataFormat = new DistributedCacheStateDataFormatter(_httpContextAccessor, name);
        }
    }
}

И помощник по регистрации (добавьте это в свой статический класс):

public static IServiceCollection AddGoogleStateDataFormatterCache(this IServiceCollection services, params string[] schemes)
{
    services.AddSingleton<IPostConfigureOptions<GoogleOptions>>(
        svcs => new ConfigureGoogleOptions(
            schemes,
            svcs.GetRequiredService<IHttpContextAccessor>())
    );
    return services;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...