为了确保正确验证您的设置,.NET 提供了一些内置资源。借助这些工具,您可以快速验证选项的属性,而无需执行任何任务,例如:
var issuer = builder.Configuration.GetValue<string>("JwtConfigSettings:Issuer");
if (string.IsNullOrEmpty(issuer))
{
throw new ArgumentNullException(nameof(issuer));
}
或
var issuer = builder.Configuration.GetValue<string>("JwtConfigSettings:Issuer");
ArgumentNullException.ThrowIfNull(nameof(issuer));
让我们检查一下 options validations 的实现方法。
使用数据注释是一种简单的方法。
我们使用用于标记要验证的属性的属性。
public class JwtConfigSettings
{
public const string Key = "JwtConfigSettings";
[Required(ErrorMessage = "Issuer is required.")]
[Range(1, 20, ErrorMessage = "Issuer limit is exceeded.")]
public string Issuer { get; set; }
[Required(ErrorMessage = "Audience is required.")]
public string Audience { get; set; }
[Required(ErrorMessage = "Validate expiration is required.")]
public bool ValidateExpiration { get; set; }
[Required(ErrorMessage = "Sign-in key is required.")]
public string SignInKey { get; set; }
}
如果要验证这一点,那么我们需要在绑定配置后添加 ValidateDataAnnotation 扩展方法。
builder.Services
.AddOptions<JwtConfigSettings>()
.Bind(builder.Configuration.GetSection(JwtConfigSettings.Key))
.ValidateDataAnnotations();
每次注入或使用 JwtConfigSettings 属性时,都会验证它们。
如果您希望在程序启动时验证 ValidateOnStart() 函数,则可以添加该函数,这在大多数情况下更有意义。
builder.Services
.AddOptions<JwtConfigSettings>()
.Bind(builder.Configuration.GetSection(JwtConfigSettings.Key))
.ValidateDataAnnotations()
.ValidateOnStart();
如果我们想要检查自定义验证,那么我们需要使用 Validate 方法:
builder.Services
.AddOptions<JwtConfigSettings>()
.Bind(builder.Configuration.GetSection(JwtConfigSettings.Key))
.ValidateDataAnnotations()
.Validate(option => option.Audience.Length <= 20, "Audience limit is exceeded.")
.ValidateOnStart();
使用 IValidateOptions<T> 接口,我们还可以清理此内容并将验证分配给相应的服务。它帮助我们简单地使用依赖注入并将我们的验证与配置解耦。
为此,我们必须构造一个新类 JwtConfigSettingsValidation,并要求它实现 IValidateOptions<JwtConfigSettings> 接口。然后,必须实现允许您返回 ValidateOptionsResult 的 Validate 方法。如果验证不成功,则返回 Fail(message) 或 ValidateOptionsResult。如果验证成功,则为 SUCCESS。
public class JwtConfigSettingsValidation : IValidateOptions<JwtConfigSettings>
{
private readonly ILogger<JwtConfigSettingsValidation> _logger;
public JwtConfigSettingsValidation(ILogger<JwtConfigSettingsValidation> logger)
{
_logger = logger;
}
public ValidateOptionsResult Validate(string name, JwtConfigSettings options)
{
_logger.LogInformation("Validating options");
if (options.Audience.Length >= 20)
{
return ValidateOptionsResult.Fail("Audience limit is exceeded.");
}
return ValidateOptionsResult.Success;
}
}
我们需要在 Program.cs 文件中注册此实现以验证配置。
builder.Services
.AddTransient<IValidateOptions<JwtConfigSettings>, JwtConfigSettingsValidation>();
我为 applications.json 添加了以下配置
{
"JwtConfigSettings": {
"Issuer": "",
"Audience": "Jaimin Jaimin Jaimin Jaimin Jaimin Jaimin Jaimin Jaimin",
"ValidateExpiration": false,
"SignInKey": "Jaimin sign in key"
}
}
让我们运行应用程序并验证配置。