C#WebApi从依赖项注入类和实体框架授权访问功能

时间:2018-10-10 09:07:45

标签: c# asp.net-web-api dependency-injection authorize

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

我有这样的Web 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 :(得分:1)

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

    //...
}

答案 1 :(得分:0)

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

修改您的 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();
     }
  }
相关问题