.net core get user in ValidationAttribute

白昼怎懂夜的黑 提交于 2019-12-10 10:43:33

问题


I am trying to access the current user (i.e. ClaimsPrincipal from identity) in a custom ValidationAttribute, and I haven't figured out how I could do that.

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

I know that I could access the user from a HttpContext (but I don't know how to get to the latter).

The main problem is that I don't have access to the User. When I use a custom ValidatorAttribute on a property, when the property gets constructed the User (or also HttpContext) is null. Meaning that I can't e.g. give the User to the Validator's constructor. That's why I'm wondering how the Validator could be made to know something about the User (and/or its claims). If I can access any of e.g. HttpContext or User inside the validator, I can get to all the other runtime information as well. Is my question understandable?


回答1:


ValidationContext has its own GetService method, which is preconfigured to use the ASP.NET Core Dependency Injection container (the IServiceProvider) when resolving services. Here's an example of how it would work in your situation:

public class UniqueTitleValidator : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var httpContextAccessor = (IHttpContextAccessor)validationContext.GetService(typeof(IHttpContextAccessor));
        var user = httpContextAccessor.HttpContext.User;

        ...
    }
}

In order to get to HttpContext, you can use IHttpContextAccessor, which is resolved here using GetService as described above (you'll need to make sure you've registered it with DI, using e.g. AddHttpContextAccessor).



来源:https://stackoverflow.com/questions/53030838/net-core-get-user-in-validationattribute

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!