C# WebApi 从依赖注入 类 和 entity framework 授权访问函数

C# WebApi Authorize access functions from dependency injection classes and entity framework

我正在尝试为我拥有的 Web API 设置一些授权。我的项目使用 Entity framework 上下文和依赖注入。

我有一个像这样的 Web API 函数:

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

我已将 AuthorizeAttribute class 扩展为:

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

    }

}

这意味着 OnAuthorization 函数将在此 API 函数被命中之前触发 - 这是我想要的并且工作正常。

我有一个函数用来判断用户是否有权限访问这个函数。该函数在接口中定义,在 class 中实现,并且 class 使用依赖注入实例化,例如:

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>();

我的问题是我想在我的 OnAuthorization 函数中调用 hasPermission 函数,例如:

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

但我不知道我该怎么做,或者是否可能?

我无法手动创建 classes,因为要添加它的 classes 和构造函数太多了,这不实用。

我试过让 Authorize2 实现一个接口,然后在我的依赖构造函数中创建一个实例,但这意味着向她 [Authorize2] 传递一个参数,这是不可能的。

我能看到的唯一其他方法是在我的 Authorize class 中手动创建此函数,但除非万不得已,否则我真的不想这样做。

将此添加到令牌中不是一种选择,数据是动态的,必须根据具体情况进行评估

您需要使用参数化构造函数解决依赖关系。

修改你的 Authorize2 class,

 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();
     }
  }

由于属性不允许依赖注入,通过 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();

    //...
}