如何立即使用选项(通过 services.Configure<> 映射)获取我的 class 的对象?
How to get an object of my class with options (that mapped via services.Configure<>) immediately?
我要为我的网站使用 JWT Bearer Authorization。但是这个的配置占用了很多地方Startup.cs
。我决定我需要在静态 class 中创建类似扩展方法的东西,以使我的 Startup.cs
更具可读性。这是此扩展方法的代码:
public static IServiceCollection AddAuthenticationWithBearer(this IServiceCollection services,
IConfiguration configuration)
{
services.Configure<AuthOptions>(configuration.GetSection("JwtOptions"));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<IJwtService, JwtService>();
// Can I use already mapped AuthOptions instead of this ???
var jwtConfigurationSection = configuration.GetSection("JwtOptions");
services.AddAuthentication().AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = jwtConfigurationSection.GetValue<bool>("ValidateIssuer"),
ValidIssuer = jwtConfigurationSection.GetValue<string>("ValidIssuer"),
ValidateAudience = jwtConfigurationSection.GetValue<bool>("ValidateAudience"),
ValidAudience = jwtConfigurationSection.GetValue<string>("ValidAudience"),
ValidateLifetime = jwtConfigurationSection.GetValue<bool>("ValidateLifetime"),
IssuerSigningKey =
new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration["AuthJwtSecret"])),
ValidateIssuerSigningKey = jwtConfigurationSection.GetValue<bool>("ValidateIssuerSigningKey"),
};
});
services.AddAuthorization();
return services;
}
评论下我的主要问题。我知道 services.Configure<AuthOptions>(configuration.GetSection("JwtOptions"));
的便利机制。因此,appsettings.json
中的 'JwtOptions' 部分映射到 AuthOptions
class。但我不知道如何在这里使用它!如你所见,我这里有configuration.GetSection("JwtOptions");
的调用,但我不喜欢。我想使用映射 AuthOptions
class。我想你明白我的原因:1)如果我要改变appsettings.json
-我只有一个地方需要考虑改变。是 AuthOptions
。接下来 - IDE 将突出显示其余部分。 2) 我只想用一种方法从 appsettings.json
获取配置。我喜欢映射 class 的方式,比如 AuthOptions
.
我假设您正在寻找 Bind
方法。
AuthOptions authOptions= new AuthOptions();
configuration.GetSection("JwtOptions").Bind(authOptions);
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = authOptions.ValidateIssuer,
ValidIssuer = authOptions.ValidIssuer
// etc.
}
services
.Configure<AuthOptions>(authOptions);
services
.AddAuthentication()
.AddJwtBearer(options =>
{
options.TokenValidationParameters = tokenValidationParameters
};
我要为我的网站使用 JWT Bearer Authorization。但是这个的配置占用了很多地方Startup.cs
。我决定我需要在静态 class 中创建类似扩展方法的东西,以使我的 Startup.cs
更具可读性。这是此扩展方法的代码:
public static IServiceCollection AddAuthenticationWithBearer(this IServiceCollection services,
IConfiguration configuration)
{
services.Configure<AuthOptions>(configuration.GetSection("JwtOptions"));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<IJwtService, JwtService>();
// Can I use already mapped AuthOptions instead of this ???
var jwtConfigurationSection = configuration.GetSection("JwtOptions");
services.AddAuthentication().AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = jwtConfigurationSection.GetValue<bool>("ValidateIssuer"),
ValidIssuer = jwtConfigurationSection.GetValue<string>("ValidIssuer"),
ValidateAudience = jwtConfigurationSection.GetValue<bool>("ValidateAudience"),
ValidAudience = jwtConfigurationSection.GetValue<string>("ValidAudience"),
ValidateLifetime = jwtConfigurationSection.GetValue<bool>("ValidateLifetime"),
IssuerSigningKey =
new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration["AuthJwtSecret"])),
ValidateIssuerSigningKey = jwtConfigurationSection.GetValue<bool>("ValidateIssuerSigningKey"),
};
});
services.AddAuthorization();
return services;
}
评论下我的主要问题。我知道 services.Configure<AuthOptions>(configuration.GetSection("JwtOptions"));
的便利机制。因此,appsettings.json
中的 'JwtOptions' 部分映射到 AuthOptions
class。但我不知道如何在这里使用它!如你所见,我这里有configuration.GetSection("JwtOptions");
的调用,但我不喜欢。我想使用映射 AuthOptions
class。我想你明白我的原因:1)如果我要改变appsettings.json
-我只有一个地方需要考虑改变。是 AuthOptions
。接下来 - IDE 将突出显示其余部分。 2) 我只想用一种方法从 appsettings.json
获取配置。我喜欢映射 class 的方式,比如 AuthOptions
.
我假设您正在寻找 Bind
方法。
AuthOptions authOptions= new AuthOptions();
configuration.GetSection("JwtOptions").Bind(authOptions);
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = authOptions.ValidateIssuer,
ValidIssuer = authOptions.ValidIssuer
// etc.
}
services
.Configure<AuthOptions>(authOptions);
services
.AddAuthentication()
.AddJwtBearer(options =>
{
options.TokenValidationParameters = tokenValidationParameters
};