【问题标题】:.net core get user in ValidationAttribute.net核心在ValidationAttribute中获取用户
【发布时间】:2020-05-05 05:16:45
【问题描述】:

我正在尝试在自定义 ValidationAttribute 中访问当前用户(即来自身份的 ClaimsPrincipal),但我还没有弄清楚如何做到这一点。

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

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

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

【问题讨论】:

  • sub 会给你用户 ID,如果你只想要 userId。

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


【解决方案1】:

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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2018-12-21
    • 2018-04-07
    相关资源
    最近更新 更多