n层网站用户认证应该存在于哪一层
On Which Tier should user authentication should exist in n-tier website
我浏览了不同的建筑书籍,比如这本:Microsoft Application Architecture Guide, 2nd Edition
现在我正在构建一个新的 n 层网站,使用 ASP.Net MVC 作为表示层。
我的问题是,如果我将使用 asp.net Identity,我应该在哪个 tier/layer 上实施用户身份验证?
我认为它应该在横切关注点中,因为我需要检查用户是否被授权或验证以访问某些功能,而且我可能会在许多层上使用用户名,例如业务、服务和表示层。
并且还认为将它专门放在表示层中会更好,因为表示层是 MVC 并且可以很容易地处理 ASP 那里的身份并允许我使用 [Authorize ] 和 [AllowAnonymous] 很容易。
我知道这个问题的答案取决于许多其他因素,但我在这里尝试实现最佳实践,因此需要了解您的观点并进行讨论。
Whosebug 上有很多类似的问题,答案也很多。这是我对此事的看法。
您必须将抽象与实现分开。
抽象(接口)定义了您需要向身份验证服务提出的问题。该接口由您的应用程序的所有其他部分使用,这些部分将使用您的身份验证服务。这意味着您的抽象必须定义在应用程序其他部分可以引用的某个地方。我的建议是将它放在业务层中,因为接口中的方法(换句话说 'questions that you want to ask to the service')通常与业务相关。另一个建议是把它放在核心层(如果你有的话)。
剩下的就是接口的实现了。我会在最简单的地方实施它。能不能在业务层做,可以。您是否需要使用来自 MVC 的标识 类,也很好,将它放在那里。放在哪里并不重要,因为它不是直接使用的。
当然,要使这一切正常工作,您需要使用一点依赖注入,为接口注册您的实现。
我发现,如果您将身份验证与授权的关注点分开,这通常是一个非常简单的答案。身份验证最终总是不得不坐在演示文稿前面。它是表示层前面 的一层。它真的必须是。
身份验证发生后,将经过身份验证的身份向下传递到其他层只是另一个模型对象,应该这样对待。将 authentication/authorization 作为横切关注点绑定到所有不同的层会使您的代码更难在不同的上下文中重用。也使测试变得更加困难。
我浏览了不同的建筑书籍,比如这本:Microsoft Application Architecture Guide, 2nd Edition 现在我正在构建一个新的 n 层网站,使用 ASP.Net MVC 作为表示层。 我的问题是,如果我将使用 asp.net Identity,我应该在哪个 tier/layer 上实施用户身份验证?
我认为它应该在横切关注点中,因为我需要检查用户是否被授权或验证以访问某些功能,而且我可能会在许多层上使用用户名,例如业务、服务和表示层。
并且还认为将它专门放在表示层中会更好,因为表示层是 MVC 并且可以很容易地处理 ASP 那里的身份并允许我使用 [Authorize ] 和 [AllowAnonymous] 很容易。
我知道这个问题的答案取决于许多其他因素,但我在这里尝试实现最佳实践,因此需要了解您的观点并进行讨论。
Whosebug 上有很多类似的问题,答案也很多。这是我对此事的看法。
您必须将抽象与实现分开。
抽象(接口)定义了您需要向身份验证服务提出的问题。该接口由您的应用程序的所有其他部分使用,这些部分将使用您的身份验证服务。这意味着您的抽象必须定义在应用程序其他部分可以引用的某个地方。我的建议是将它放在业务层中,因为接口中的方法(换句话说 'questions that you want to ask to the service')通常与业务相关。另一个建议是把它放在核心层(如果你有的话)。
剩下的就是接口的实现了。我会在最简单的地方实施它。能不能在业务层做,可以。您是否需要使用来自 MVC 的标识 类,也很好,将它放在那里。放在哪里并不重要,因为它不是直接使用的。
当然,要使这一切正常工作,您需要使用一点依赖注入,为接口注册您的实现。
我发现,如果您将身份验证与授权的关注点分开,这通常是一个非常简单的答案。身份验证最终总是不得不坐在演示文稿前面。它是表示层前面 的一层。它真的必须是。
身份验证发生后,将经过身份验证的身份向下传递到其他层只是另一个模型对象,应该这样对待。将 authentication/authorization 作为横切关注点绑定到所有不同的层会使您的代码更难在不同的上下文中重用。也使测试变得更加困难。