我试图在自定义ValidationAttribute中访问当前用户(即来自身份的ClaimsPrincipal),我还没弄明白我该怎么做。
public class UniqueTitleValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// var user = ?
}
}
我知道我可以从HttpContext访问用户(但我不知道如何到达后者)。
主要问题是我无法访问用户。当我在属性上使用自定义ValidatorAttribute时,在构造属性时,User(或HttpContext)为null。意思是我不能,例如将用户提供给Validator的构造函数。这就是为什么我想知道如何使Validator了解用户(和/或其声明)。如果我可以访问任何例如验证器内部的HttpContext或User,我也可以获取所有其他运行时信息。我的问题可以理解吗?
ValidationContext
有自己的GetService
方法,该方法预先配置为在解析服务时使用ASP.NET Core Dependency Injection容器(IServiceProvider
)。以下是它在您的情况下如何工作的示例:
public class UniqueTitleValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var httpContextAccessor = (IHttpContextAccessor)validationContext.GetService(typeof(IHttpContextAccessor));
var user = httpContextAccessor.HttpContext.User;
...
}
}
为了到达HttpContext
,你可以使用IHttpContextAccessor
,这里使用如上所述的GetService
解决(你需要确保你已经使用例如AddHttpContextAccessor
将其注册到DI)。