通过以下方式使用AddOidcStateDataFormatterCache方法时:
services.AddOidcStateDataFormatterCache();
仅适用于使用
添加的提供商.AddOpenIdConnect();
使用
时是否有一种方法可以应用distributedCacheFormatter.AddGoogle()
Google也是OpenId Provider,可以使用.AddOpenIdConnect或.AddGoogle添加,但使用.AddGoogle不会使用状态数据格式化程序。我通过检查redis缓存(用作IDistributedCache的基础实现)确认了这一点,并在使用.AddOpenIdConnect时看到创建了“ DistributedCacheStateDataFormatter ...”的键,但使用.AddGoogle时却未创建任何内容。
我在想这可能是因为.AddGoogle可能使用其他身份验证处理程序,而该处理程序不会被AddOidcStateDataFormatterCache自动获取
答案 0 :(得分:1)
这是因为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;
}