Как вставить мою собственную логику в AddAuthorization () AuthorizationServiceCollectionExtensions? - PullRequest
0 голосов
/ 02 ноября 2018

Я работаю над решением для авторизации на основе утверждений для проекта .net-core. Я начал с примера Microsoft.Graph (https://github.com/microsoftgraph/aspnetcore-connect-sample). Это было полезно.

Я хочу вставить свою собственную логику в метод AddAuthorization (). Я знаю, что могу просто добавить к нему логику, как в файле Starup.cs:

services.AddAuthorization(options =>
        {
            //Add own logic
        });

В приведенном выше примере они делают нечто похожее с классом AzureAdAuthenticationBuilderExtensions. В этом классе я добавил свою собственную логику.

public static class AzureAdAuthenticationBuilderExtensions
{
    public static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder builder)
        => builder.AddAzureAd(_ => { });

    public static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder builder, Action<AzureAdOptions> configureOptions)
    {
        builder.Services.Configure(configureOptions);
        builder.Services.AddSingleton<IConfigureOptions<OpenIdConnectOptions>, ConfigureAzureOptions>();
        builder.AddOpenIdConnect();
        return builder;
    }

    private class ConfigureAzureOptions : IConfigureNamedOptions<OpenIdConnectOptions>
    {
        private readonly AzureAdOptions _azureOptions;

        public ConfigureAzureOptions(IOptions<AzureAdOptions> azureOptions)
        {
            _azureOptions = azureOptions.Value;
        }

        public void Configure(string name, OpenIdConnectOptions options)
        {
            options.ClientId = _azureOptions.ClientId;
            options.Authority = $"{_azureOptions.Instance}{_azureOptions.TenantId}";
            options.UseTokenLifetime = true;
            options.CallbackPath = _azureOptions.CallbackPath;
            options.RequireHttpsMetadata = false;


            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
            };

            options.Events = new OpenIdConnectEvents
            {
                OnAuthenticationFailed = context =>
                {
                    context.Response.Redirect("/Home/Error");
                    context.HandleResponse();
                    return Task.CompletedTask;
                },
                OnTokenValidated = context =>
                {
                    //New logic I have obscured for clarity. 
                    //Here I add claims to the ClaimsIdentity object.

                    return Task.FromResult(0);
                }
            };

        }

        public void Configure(OpenIdConnectOptions options)
        {
            Configure(Options.DefaultName, options);
        }
    }
}

Я хотел бы переопределить (не уверен, что использую правильное слово) AddAuthorization () объекта IServiceCollection в startup.cs.

Я начал с, но я не уверен, куда идти отсюда:

    public static class AuthorizationServiceCollectionExtensionsTest
{
    public static IServiceCollection AddAuthorization(this IServiceCollection services)
        => services.AddAuthorization(_ => { });

    public static IServiceCollection AddAuthorization(this IServiceCollection services, Action<AuthorizationOptions> configure)
    {
        services.Configure(configure);
        //add singleton? then I add that class below?
        return services.AddAuthorization();
    }
}

Кроме того, бонусный вопрос для новичков: откуда приложение знает, как смотреть на логику этих новых классов расширений, которые я создаю?

Спасибо, John

...