ASP.NET中的自定义授权是过滤器还是控制器的构造函数?

时间:2013-02-19 20:23:13

标签: asp.net asp.net-mvc authentication asp.net-web-api authorization

在我的ASP.NET Web API控制器中,我想限制对User角色中的访问者的访问。执行此操作的常用方法是扩展AuthorizeAttribute(exampleexample),然后使用我的自定义属性(例如[AuthorizeUser])使用我的控制器。

另一种方法是在控制器的构造函数中添加一个函数。无论如何都需要构造函数,因为我正在使用依赖注入。

以下是一些代码:

public class MyController: ApiController
{
    private IUnitOfWork unitOfWork;
    private IAccountUtils accountUtils;

    // Constructor
    public MyController(
        IUnitOfWork unitOfWork, 
        IAccountUtils accountUtils)
    {
        this.unitOfWork = unitOfWork;
        this.accountUtils = accountUtils;

        // Restrict access to 'User' role
        accountUtils.ThrowExceptionIfUserNotInRole(User.Identity, "User");
    }

    // More code
}

因为有无数的教程和使用过滤器来授权用户的例子,我认为这是最好的方法。但是,当我在调试器中逐步执行代码时,我发现构造函数方法在筛选器之前被触发。

要优化代码,如果用户未被授权访问控制器,则应尽快中断。如果我没有弄错的话,那么在构造函数中而不是在过滤器中执行授权应该更有效。我是对的还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

您的主要关注点似乎是优化您的代码,并且您应该注意控制器构造函数在授权过滤器之前运行是正确的。但是这两种解决方案之间的性能差异非常很小,不应该真正影响您的服务。

虽然从构造函数中抛出可能会起作用,但它并不是最优雅的解决方案,因为它要求您在代码中进行授权而不是以声明方式使用属性进行授权。它还会强制您将对象实例化逻辑与不那么干净的授权逻辑混合在一起。

所以我建议只是坚持使用授权过滤器。