Я работаю над решением для авторизации на основе утверждений для проекта .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