.net core在ValidationAttribute中获取用户

问题描述 投票:2回答:1

我试图在自定义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,我也可以获取所有其他运行时信息。我的问题可以理解吗?

c# asp.net-core asp.net-core-2.1 .net-core-2.1
1个回答
7
投票

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)。

© www.soinside.com 2019 - 2024. All rights reserved.