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();
//...
}
我正在尝试为我拥有的 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();
//...
}