.net核心使用ValidationAttribute

时间:2018-10-28 11:09:40

标签: c# asp.net-core asp.net-core-2.1 .net-core-2.1

我正在尝试通过自定义的ValidationAttribute访问当前用户(即,从身份获取ClaimsPrincipal),但我还没有弄清楚该怎么做。

public class UniqueTitleValidator : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
      // var user = ?
    }
}

我知道我可以从HttpContext访问用户(但是我不知道如何访问后者)。

主要问题是我无权访问该用户。当我在属性上使用自定义ValidatorAttribute时,在构造属性时,User(或HttpContext)为null。意思是我不能将用户交给验证者的构造函数。这就是为什么我想知道如何使验证器了解有关用户(和/或其声明)的信息。如果我可以访问任何一个验证器中的HttpContext或User,我也可以获取所有其他运行时信息。我的问题可以理解吗?

1 个答案:

答案 0 :(得分:4)

ValidationContext有其自己的GetService方法,该方法已预先配置为在解析服务时使用ASP.NET Core依赖注入容器(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进行了解析(您需要确保已向其注册DI,例如使用AddHttpContextAccessor)。