授权验证应该在控制器还是业务逻辑中

Should authorization validation be in the controller or business logic

我有一个内部 CRM 系统,可以让客户查看他们的发票。

函数中的第 5 行检查发票是否属于已登录的客户 (if (invoice.CustomerId != loggerInCustomerId))。

我不确定这里是否应该进行检查。

public ActionResult ViewInvoice(Guid invnum)
    {
        int loggerInCustomerId = GetTheLoggedInCustomerId();
        Invoice invoice = _invoiceLogic.GetInvoice(invnum);

        if (invoice.CustomerId != loggerInCustomerId)
        {
            //Invalid Action
            return RedirectToAction("Index", "MyInvoices");
        }
        //do other stuff as normal
    }

这个检查是否应该移到业务逻辑中? GetInvoice 将接受发票编号参数和登录用户的参数。 GetInvoice 然后会执行此检查并抛出异常,我会在我的操作方法中有一个 Try Catch。

或者有更好的方法吗?

Should this check be moved into the business logic?

是的,您可以,在这种情况下,您会将登录的用户身份传递给 BL 方法调用。但是我认为将此检查保留在您的控制器本身中没有任何问题。

无论如何,您通过调用 GetInvoice() 从您的 BL 获取发票,然后进行检查以查看要采取的操作,因此对我来说,将此检查保留在您的 [=11] 中很有意义=] 而不是在业务层中。

但是,是的,这是一个有争议的问题。