我正在尝试为我拥有的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
类中手动创建此函数,但是除非不需要,否则我真的不想这样做。
将其添加到令牌中不是一种选择,数据是动态的,必须根据具体情况进行评估
答案 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();
}
}