.net core получить пользователя в ValidationAttribute

Я пытаюсь получить доступ к текущему пользователю (т. е. ClaimsPrincipal из идентификатора) в пользовательском атрибуте ValidationAttribute, и я не понял, как это сделать.

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

Я знаю, что могу получить доступ к пользователю из HttpContext (но я не знаю, как добраться до последнего).

Основная проблема в том, что у меня нет доступа к User. Когда я использую пользовательский атрибут ValidatorAttribute для свойства, когда свойство создается, пользователь (или также HttpContext) имеет значение null. Это означает, что я не могу, например. передать пользователя конструктору валидатора. Вот почему мне интересно, как Валидатор может узнать что-то о Пользователе (и/или его утверждениях). Если я могу получить доступ к любому из, например. HttpContext или User внутри валидатора, я также могу получить всю другую информацию о времени выполнения. Мой вопрос понятен?


person Doidel    schedule 28.10.2018    source источник
comment
sub даст вам идентификатор пользователя, если вы просто хотите userId.   -  person prisar    schedule 28.10.2018


Ответы (1)


ValidationContext имеет свои собственный GetService метод, который предварительно настроен для использования контейнера ASP.NET Core Dependency Injection, IServiceProvider при разрешении services. Вот пример:

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 .

person Kirk Larkin    schedule 29.10.2018