Я создаю свой собственный пакет, чтобы отвлечь пользователя от некоторых вещей.
Мой оригинал Startup.cs
выглядел как
services.AddAuthentication(options =>
{
// Store the session to cookies
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
// OpenId authentication
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(o =>
{
// URL of the Keycloak server
o.Authority = Configuration["Jwt:Authority"];
// Client configured in the Keycloak
o.ClientId = Configuration["Jwt:ClientId"];
...
}
Я хочу извлечь эти методы Add * в мой собственный пакет вроде этого:
public static class MyExtension
{
public static IServiceCollection AddMyAuthentication(this IServiceCollection services)
{
// Add ASP.NET Core Options libraries - needed so we can use IOptions<SVOSOptions>
services.AddOptions();
services.AddAuthentication(options =>
{
// Store the session to cookies
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
// OpenId authentication
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(o =>
{
// URL of the Keycloak server
o.Authority = * MyOptions.Authority *;
// Client configured in the Keycloak
o.ClientId = * MyOptions.ClientId *
...
});
return services;
}
public static IServiceCollection AddMyAuthentication(this IServiceCollection services, Action<MyOptions> configure)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (configure != null)
{
services.Configure(configure);
}
return services.AddMyAuthentication();
}
}
Конечно, я хочу заменить все вызовы Configuration [] в моем классе некоторыми параметрами, которые я хочу отправить из моего нового Startup.cs
, например:
services.AddMyAuthentication(options => {
options.Authority = Configuration["Jwt:Authority"];
options.ClientId = Configuration["Jwt:ClientId"];
})
Я также делаю это, потому что хочу жестко запрограммировать, что пользователю не нужно знать. Я надеюсь, что это правильный способ сделать что-то подобное.