Внедрение зависимостей в IAuthorizationFilter ASP. Net Core 3 - PullRequest
0 голосов
/ 22 марта 2020

Я создаю фильтр IAuthorizationFilter и мне нужно использовать DepencyInjection в этом атрибуте.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AllowAccessAttribute : Attribute, IAuthorizationFilter
{
    private readonly IDomainUnitOfWork unitofwork;
    private readonly HttpContext httpContext;

    public AllowAccessAttribute(IDomainUnitOfWork unitofwork,HttpContext httpContext)
    {
        this.unitofwork = unitofwork;
        this.httpContext = httpContext;
    }
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        string controller = context.RouteData.Values["controller"].ToString();
        string action = context.RouteData.Values["action"].ToString();
        var userId = httpContext.User.Identity.GetUserId<long>();
        var access = string.Format("{0}:{1}", controller, action);
        if (unitofwork.UserRepository.AccessLevelRepository.ValidateAccess(userId, access))
            context.Result = new StatusCodeResult(403);
    }
}

Когда мне нужно использовать этот атрибут, он показывает мне ошибку

[HttpGet]
[AllowAccess]
public async Task<ApiReturn> ChangeUserActiveStatus(long id)
{
    var result = await dispatchers.SendAsync(new UserActiveStateCommand { id = id });
    if (result.Success)
    {
        return Ok();
    }
    return BadRequest(result.Exception);
}

И покажите эту ошибку:

Не указан аргумент, соответствующий необходимому формальному параметру 'unitofwork' в 'AllowAccessAttribute.AllowAccessAttribute (IDomainUnitOfWork, HttpContext)

В чем проблема? как я могу решить эту проблему?

1 Ответ

1 голос
/ 22 марта 2020

Вам необходимо зарегистрировать службу в контейнере Io C.

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<IDomainUnitOfWork, DomainUnitOfWork>(); // per request injection
    ...
}

Попробуйте также изменить атрибут метода на TypeFilter:

[HttpGet]
[TypeFilter(typeof(AllowAccessAttribute))]
public async Task<ApiReturn> ChangeUserActiveStatus(long id)
...