Я пытаюсь понять, как мы можем использовать сильный тип при создании OpenIDConnectOptions.
Я знаю, что мы можем реализовать строгий тип для настроек приложений и других элементов, используя класс POCO и реализацию IOptions и получая доступ к ним из конструктора контроллера. Но здесь моя проблема перед частью контроллера. При запуске во время выполнения происходит сбой.
Для начала у меня есть startup.configureservice с:
services.AddAzureADOpenIDAuthentication(Configuration);
У меня есть метод расширения для IServiceCollection для AddAzureADOpenIDAuthentication, например:
services.Configure<AzureADOptions>(configuration.GetSection("Authentication:AzureAd"));
services.AddSingleton<IOptionsMonitor<OpenIdConnectOptions>, AzureADOpenIdConnectOptionsSetup>();
services.AddAuthentication(auth =>
{
auth.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
auth.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
auth.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie().AddOpenIdConnect();
return services;
Наконец, у меня есть AzureADOpenIdConnectOptionsSetup с реализацией IOptionsMonitor, как показано ниже:
public class AzureADOpenIdConnectOptionsSetup : IOptionsMonitor<OpenIdConnectOptions>
{
public OpenIdConnectOptions CurrentValue { get; set; }
public AzureADOpenIdConnectOptionsSetup(IOptionsMonitor<AzureADOptions> azureADOptions)
{
CurrentValue = new OpenIdConnectOptions();
CurrentValue.ClientId = azureADOptions.CurrentValue.ClientId;
CurrentValue.Authority = azureADOptions.CurrentValue.Authority;
CurrentValue.CallbackPath = azureADOptions.CurrentValue.CallbackPath;
}
public OpenIdConnectOptions Get(string name)
{
return CurrentValue;
}
public IDisposable OnChange(Action<OpenIdConnectOptions, string> listener)
{
throw new NotImplementedException();
}
}
Когда я запускаю этот код, он дважды попадает в Constructor и OpenIdConnectOptions Get, и через точку останова на уровне конструктора я проверяю, правильно ли переданы настройки из azureADOptions в OpenIdConnectOptions CurrentValue. Тем не менее, я получаю сообщение об ошибке (до того, как я нажму войти, это означает, что он запускается самостоятельно)
InvalidOperationException: Предоставьте полномочия, MetadataAddress, Configuration или ConfigurationManager для OpenIdConnectOptions
Я не уверен, правильно ли я реализовал OpenIdConnectOptions Get(string name) или нет. Еще одно сомнение: как мне реализовать OnChange(Action listener) для прослушивания изменений во время выполнения appsettings.json