Identity Server 4 AddOidcStateDataFormatterCache不适用于AddGoogle

时间:2019-07-10 08:26:35

标签: identityserver4

通过以下方式使用AddOidcStateDataFormatterCache方法时:

services.AddOidcStateDataFormatterCache();

仅适用于使用

添加的提供商
.AddOpenIdConnect();

使用

时是否有一种方法可以应用distributedCacheFormatter
.AddGoogle() 

Google也是OpenId Provider,可以使用.AddOpenIdConnect或.AddGoogle添加,但使用.AddGoogle不会使用状态数据格式化程序。我通过检查redis缓存(用作IDistributedCache的基础实现)确认了这一点,并在使用.AddOpenIdConnect时看到创建了“ DistributedCacheStateDataFormatter ...”的键,但使用.AddGoogle时却未创建任何内容。

我在想这可能是因为.AddGoogle可能使用其他身份验证处理程序,而该处理程序不会被AddOidcStateDataFormatterCache自动获取

1 个答案:

答案 0 :(得分:1)

这是因为GoogleOptions类继承自OAuthOptions而不是OpenIdConnectOptions,但是它们都具有ISecureDataFormat<AuthenticationProperties> StateDataFormat,因此您可以重复使用提供的DistributedCacheStateDataFormatteridentityserver4

后配置类:

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;
}