OpenIdConnectOptions строгого типа для aspnet core 2.0

Я пытаюсь понять, как мы можем использовать сильный тип при создании 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


person Brijesh    schedule 19.08.2017    source источник


Ответы (1)


Для возврата OpenIdConnectOptions вам необходимо инициализировать ConfigurationManager и простой код, как показано ниже:

    public static class AzureAdAuthenticationBuilderExtensions
{      
    public static AuthenticationBuilder AddAzureADOpenIDAuthentication(this AuthenticationBuilder builder, IConfiguration configuration)
    {
        builder.Services.Configure<AzureAdOptions>(configuration.GetSection("AzureAd"));

        builder.Services.AddSingleton<IOptionsMonitor<OpenIdConnectOptions>, AzureADOpenIdConnectOptionsSetup>();

        builder.Services.AddAuthentication(auth =>
        {
            auth.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            auth.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            auth.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
        .AddOpenIdConnect();
        return builder;
    }

    public class AzureADOpenIdConnectOptionsSetup : IOptionsMonitor<OpenIdConnectOptions>
    {
        public OpenIdConnectOptions CurrentValue { get; set; }
        private IDataProtectionProvider _dataProtectionProvider;

        public AzureADOpenIdConnectOptionsSetup(IOptionsMonitor<AzureAdOptions> azureADOptions,IDataProtectionProvider dataProtectionProvider)
        {
            _dataProtectionProvider = dataProtectionProvider;
            CurrentValue = new OpenIdConnectOptions
            {
                ClientId = azureADOptions.CurrentValue.ClientId,
                Authority = $"{azureADOptions.CurrentValue.Instance}{azureADOptions.CurrentValue.TenantId}",
                CallbackPath = azureADOptions.CurrentValue.CallbackPath
            };
        }

        public OpenIdConnectOptions Get(string name)
        {
            OpenIdConnectPostConfigureOptions op = new OpenIdConnectPostConfigureOptions(_dataProtectionProvider);
            op.PostConfigure(name, CurrentValue);
            return CurrentValue;
        }

        public IDisposable OnChange(Action<OpenIdConnectOptions, string> listener)
        {
            throw new NotImplementedException();
        }
    }        
}
person Edward    schedule 25.08.2017