3

在我的 ASP.NET Web API 控制器中,我想限制对用户角色的访问。执行此操作的常用方法是扩展 AuthorizeAttribute ( example , example ),然后使用我的自定义属性 (例如 [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
}

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

为了优化代码,如果用户无权访问控制器,尽快中断是有意义的。如果我没记错的话,在构造函数中而不是在过滤器中执行授权应该更有效。我是正确的还是我在这里遗漏了什么?

4

1 回答 1

1

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

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

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

于 2013-02-19T21:22:06.473 回答