.net core получить пользователя в ValidationAttribute - PullRequest
0 голосов
/ 28 октября 2018

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

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

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

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

1 Ответ

0 голосов
/ 29 октября 2018

ValidationContext имеет собственный метод GetService, который предварительно настроен для использования контейнера инъекции зависимостей ядра ASP.NET (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).

...