ASP.NET MVC 5 中的 Actionfilter 注入

2024-04-27

我有一个简单的过滤器。

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。我无法使用旧版本。

我很清楚这个黑客行为。

为单个控制器重复调用操作过滤器构造函数 https://stackoverflow.com/questions/11333575/action-filter-constructor-being-called-repeatedly-for-single-controller

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

我如何使用 MVC 5 的 Ninject 来实现相同的效果?

EDIT: 大规模失败

我忘记包括:

using Ninject.Web.Mvc.FilterBindingSyntax;

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

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


虽然你的问题不同,但答案是完全一样的this one https://stackoverflow.com/questions/27245220/how-can-i-test-for-the-presence-of-an-action-filter-with-constructor-arguments/27470397#27470397.

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

  1. 不包含用于标记控制器和操作方法的行为的属性。
  2. 一个 DI 友好的类,它实现了动作过滤器 http://msdn.microsoft.com/en-us/library/system.web.mvc.iactionfilter(v=vs.100).aspx and/or 身份验证过滤器 https://msdn.microsoft.com/en-us/library/system.web.mvc.filters.iauthenticationfilter%28v=vs.118%29.aspx其中包含所需的行为以及用于检查属性的扫描实现。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 5 中的 Actionfilter 注入 的相关文章

随机推荐

  • Processmaker 中的 Jquery Ajaxing

    我正在使用一个名为 ProcessMaker 的网络应用程序 他们不支持 jquery 所以我必须自己弄清楚如何整合它 他们的论坛上有很多人试图完成它 所以幸运的是它现在已经被记录下来 如果有人愿意这样做 这里是我详细介绍了该过程的链接 我
  • 循环遍历 POST 数组

    我需要循环遍历 post 数组并提交它 stuff 1
  • 如何训练具有 2D 输出的网络? (蟒蛇,凯拉斯)

    我想训练一个回归网络 其输出是两个坐标 x1 y1 和 x2 y2 我的问题是 如果我想训练网络 我的输出应该分开吗 我的意思是我的输出应该是这样的 x1 y1 x2 y2 或者有没有办法将它们堆叠起来 例如 x1 y1 x2 y2 提前致
  • 明确的追溯 .gitignore (如何让 Git 完全/追溯地*忘记*现在在 .gitignore 中的文件)

    Preface This question attempts to clear the confusion regarding applying gitignore retroactively not just to the present
  • 使用局部函数和全局函数哪个更优化?

    我想知道使用 a 是否更优化局部功能 在下面的例子中 drawBitmap 只需要3个参数 and 无法内联因为该函数访问一些所有者过程变量 或者使用可以内联的全局函数 但它真的会内联吗 这需要5个参数 也不知道这是否重要 但是这段代码主要
  • C# 析构函数未按预期工作

    请参阅下面的代码 我希望它打印 10 之一 因为我已经显式调用了垃圾收集器 但我总是得到 0 或 20 作为输出 这是为什么 void Main Panda forest panda new Panda 10 for int i 0 i
  • 将数据导入mysql的最佳方法

    我有一个包含 500 000 行和大约 10 列的表 该表处于访问状态 我如何将其导入到mysql 这是关于该主题的文章 http www kitebird com articles access migrate html http www
  • C# 判断一个数是否为无穷大

    我有一个小问题 我有两个双精度变量 每个变量的值为 1 10 250 现在 如果我将这两个值相乘 我会得到一个结果 它也是一个双精度变量 问题是乘法的结果给了我无穷大的值 但我想防止这种情况并给出错误消息 因此 如果有人知道如何识别数字是否
  • SQL 中的双冒号 `::` 表示法

    我捡到了某人的代码 以下是其中的一部分WHERE条款 这里的双冒号表示什么 b date completed gt a dc date INTERVAL 1 DAY 7 20 00 它根据 RDBMS 的不同而有所不同 但如果我猜对的话 那
  • 删除 rmarkdown 文档中的部分

    我希望将章节标题放在页眉而不是页面正文中 fancyhead C 将节标题放在标题中 但如何抑制节的正文打印 title Untitled classoption landscape output pdf document number s
  • 如何从 UIView 中仅删除用户添加的子视图

    我试图删除添加到视图中的所有子视图 因此我实现了一个循环来使用以下内容迭代子视图 for subview in view subviews println subview subview removeFromSuperview 我通过向我的
  • 如何在 Dart 中保存文本输入框中的值并稍后加载?

    来自邮件列表 如何创建某种文本输入框 以允许我保存该文本并稍后在代码中使用它 我正在使用达特 结合使用 InputElements 和 HTML5 本地存储 Dart 中的 Storage 接口实现了 Map 因此您可以将键 值对存储为字符
  • 从一个组件访问另一个组件的方法

    我在 Angular 中 需要从另一个组件调用一个组件的方法 拥有这个组件 import Component OnInit Input from angular core Component selector app popover tem
  • Excel 单元格到文本框的超链接

    我正在尝试手动将超链接放入单元格中 指向文本框 网上搜索无果 在 添加超链接 对话框窗口中 我尝试在 单元格引用类型 窗口中写入文本框的名称 TextBox1 但得到 引用无效 在同一窗口的 定义名称 下也没有 TextBox1 我的两个问
  • 大量点的贝塞尔曲线近似

    我有大约一百个点 我想用贝塞尔曲线来近似 但如果超过 25 个点 或类似的点 组合数量的阶乘计数会导致数字溢出 有没有一种方法可以以类似贝塞尔曲线的方式近似如此数量的点 平滑曲线 无需经过所有点 除了第一个和最后一个点 或者我是否需要选择另
  • 使用 css 设计 ng-bootstrap 手风琴样式

    我有一个带有手风琴的 Angular 2 组件 我使用 ng bootstrap 添加了它 一切功能正常 但是我尝试使用加载的样式 card card header card block已编译的手风琴元素具有的类 这些样式根本不会应用于元素
  • Django - 通过对两个查询集进行排序来合并它们

    我有两个模型 我正在这样查询它们 firstq FirstModel objects order by addedtime secondq SecondModel objects order by addedtime 我想对它们进行合并和排
  • 如何保存和编辑电缆打印的内容?

    这是后续如何以最小的格式将数据框导出到乳胶 https stackoverflow com questions 45929263 how to export a dataframe to latex with some minimal fo
  • 在列表列表中查找匹配值

    我正在尝试迭代 python 2 7 5 中的列表列表 并返回在第二个列表中找到第一个值的列表 如下所示 python 2 7 5 list1 aa ab bb bc cc list2 aa 1 3 7 de 2 2 1 bc 3 4 4
  • ASP.NET MVC 5 中的 Actionfilter 注入

    我有一个简单的过滤器 public class IsAdmin ActionFilterAttribute IAuthenticationFilter private string roleName IBusinessIdentity id