C # WebApi Авторизовать функции доступа из классов внедрения зависимостей и структуры сущностей - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь настроить авторизацию для имеющегося у меня веб-API.Мой проект использует контекст Entity Framework и внедрение зависимостей.

У меня есть такая функция веб-API:

[Authorize2]
[HttpPost]
[Route("whatever")]
public async Task<IHttpActionResult> APIfunction()
{           
   //Do something...
   return Ok();
}

, и я расширил класс AuthorizeAttribute до этого:

public class Authorize2 : AuthorizeAttribute
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="actionContext"></param>
    public override void OnAuthorization(HttpActionContext actionContext)
    {

    }

}

Это означает, что функция OnAuthorization сработает до того, как эта функция API будет нажата - что мне нужно и работает нормально.

У меня есть функция, которая используется для определения, является ли пользовательимеет разрешение на доступ к этой функции.Функция определена в интерфейсе, реализована в классе, и экземпляр класса создается с помощью внедрения зависимостей, например:

public interface IPermissions
{
   bool hasPermission();
}

public class Permissions : IPermissions
{
   public Permissions(numerous DI interfaces passed into the constructor)
   {
       //Assign values....
   }

   public bool hasPermission()
   {

   {
}

, и моя конфигурация зависимостей имеет следующее:

container.Register<Permissions, IPermissions>();

Моя проблемачто я хочу вызвать функцию hasPermission в моей функции OnAuthorization, например, так:

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var perm = _permissions.hasPermission();
    }

Но я не знаю, как я могу это сделать, или если это вообще возможно?

Я не могу создать классы вручную, так как есть много классов и конструкторов, чтобы добавить его, и это нецелесообразно.

Я попытался заставить Authorize2 реализовать интерфейс, а затем создать экземпляр в моей зависимостиконструктор, но это означало бы передачу параметра ей [Authorize2], что невозможно.

Единственный другой способ, который я вижу, - это создать эту функцию вручную в моем классе Authorize, но я действительно это делаюЯ не хочу этого делать, если мне не нужно.

Добавление этого к токену не вариант, и данные являются динамическими и должны оцениваться в каждом конкретном случае

Ответы [ 2 ]

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

Поскольку атрибуты не позволяют внедрять зависимости, используйте расположение службы через DependencyResolver, которое вы можете получить через ActionContext

public override void OnAuthorization(HttpActionContext actionContext) {
    var resolver = actionContext.RequestContext.Configuration.DependencyResolver;
    var _permissions = (IPermissions)resolver.GetService(typeof(IPermissions));
    var perm = _permissions.hasPermission();

    //...
}
0 голосов
/ 10 октября 2018

Необходимо разрешить зависимость с помощью параметризованного конструктора.

Изменить класс Authorize2 ,

 public class Authorize2 : AuthorizeAttribute
 { 
     private readonly IPermissions _permissions;
     public Authorize2(IPermissions permissions)
     {
             this._permissions=permissions;
     }
     public override void OnAuthorization(HttpActionContext actionContext)
     {
          var perm = _permissions.hasPermission();
     }
  }
...