【问题标题】:Actionfilter Injection in ASP.NET MVC 5ASP.NET MVC 5 中的 Actionfilter 注入
【发布时间】:2015-03-01 11:50:53
【问题描述】:

我有一个简单的过滤器。

public class IsAdmin : ActionFilterAttribute, IAuthenticationFilter
{
    private string _roleName;
    IBusinessIdentity _identity;

    public IsAdmin(string roleName, IBusinessIdentity identity)
    {
        this._roleName = roleName;
        this._identity = identity;
    }

    public void OnAuthentication(AuthenticationContext filterContext)
    {
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        if (!_identity.Roles.Contains(_roleName))
            filterContext.Result = new HttpUnauthorizedResult();
    }
}

我正在使用 Ninject。这是我的控制器。我正在尝试将注入的服务放入我的 ActionFilter 中,以便不依赖于 HttpContext,而是依赖于我的 IBusinessIdentity

IBusinessIdentity 被注入 HttpContext.User.Identity`。它会执行一些数据库调用并获取 userRoles。

public class HomeController : Controller
{
    readonly IBusinessIdentity _identity;

    public HomeController(IBusinessIdentity identity)
    {
        this._identity= identity;
    }

    [IsAdmin("Admin", _identity)]
    public ActionResult Index()
    {
        return View();  
    }
}

这不起作用,当我尝试在编译时将“身份”放入 actionfilter 构造函数时,我遇到了编译器错误。

非静态字段、方法或属性需要对象引用

我需要这个,因为我打算用身份测试各种权限。

我正在考虑在控制器实例化后进行某种反射。我对如何做到这一点有一个非常模糊的想法。

我正在使用 ASP.NET MVC 5,但我没有 kernel.bindfilter。我不能使用旧版本。

我很清楚这种黑客行为。

Action filter constructor being called repeatedly for single controller

https://github.com/ninject/Ninject.Web.Mvc/wiki/Conditional-bindings-for-filters

如何使用 Ninject for MVC 5 实现相同的效果。

编辑:大失败

我忘了包括:

using Ninject.Web.Mvc.FilterBindingSyntax;

现在一切都按照上述链接中的说明进行。

现在我需要弄清楚如何在过滤器构造函数中注入“roleName”字符串。虽然我认为只是为每个角色构建一个过滤器。我稍后会发布整个代码。

【问题讨论】:

  • 应该是readonly IBusinessIdentity _identity[IsAdmin("Admin", _identity)]
  • 是的,对不起,我纠正了我的错误。
  • 这行得通吗?我看到一个帖子stackoverflow.com/questions/5809755/… 它说属性参数有一些限制。您的IBusinessIdentity 可以作为参数传递?

标签: asp.net asp.net-mvc dependency-injection inversion-of-control ninject


【解决方案1】:

虽然你的问题不同,但答案和this one完全一样。

DI 友好属性不应该定义任何行为。您需要将行为分离到一个单独的过滤器中,该过滤器可以在应用程序启动时注入其依赖项。这可以通过将您的操作过滤器属性分成两部分来完成。

  1. 一个不包含任何行为来标记您的控制器和操作方法的属性。
  2. 一个对 DI 友好的类,它实现了 IActionFilter 和/或 IAuthenticationFilter,其中包含所需的行为,并通过扫描实现来检查属性。

不要让 Microsoft 的 ActionFilterAttribute 营销欺骗了您。这种方法对 DI 完全不利。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2019-04-17
    • 2018-10-31
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多