Я пытаюсь настроить авторизацию для имеющегося у меня веб-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
, но я действительно это делаюЯ не хочу этого делать, если мне не нужно.
Добавление этого к токену не вариант, и данные являются динамическими и должны оцениваться в каждом конкретном случае