在n层网站中应该存在用户身份验证的层

时间:2015-06-18 19:38:53

标签: asp.net-mvc architecture asp.net-identity n-tier-architecture

我浏览了不同的建筑书籍,例如:Microsoft Application Architecture Guide, 2nd Edition 现在我正在用ASP.Net MVC作为表示层构建一个新的n层网站。 我的问题是,如果我将使用asp.net Identity,我应该在哪个层/层实现用户身份验证?

我认为它应该存在于Cross Cutting Concerns中,因为我需要检查用户是否经过授权或验证才能访问某些功能,而且我可以在许多层上使用用户名,例如Business,Services和Presentation图层

并且还认为最好将它放在Presentation层中,因为表示层是MVC并且很容易从那里处理ASP Identity并允许我轻松地使用[Authorize]和[AllowAnonymous]

我知道这个问题的答案取决于许多其他因素,但我在这里尝试实现最佳实践,因此需要了解您的观点并进行讨论。

2 个答案:

答案 0 :(得分:1)

这里有很多关于stackoverflow的类似问题,只有很多答案。这是我对此事的看法。

您必须将抽象与实现分开。

抽象(接口)定义了您需要向身份验证服务提出的问题。应用程序的所有其他部分将使用此接口来使用您的身份验证服务。这意味着您的抽象必须定义在可以由应用程序的其他部分引用的某个位置。我的建议是把它放在业务层,因为界面中的方法(换句话说,你想要问服务的问题')通常与业务有关。另一个建议是将它放在Core层(如果有的话)。

这使我们得到了接口的实现。我会在最简单的地方实现这一点,你可以这样做。你能在商业层做到这一点,很好。你是否需要使用MVC中的身份类,也可以将它放在那里。它放在哪里并不重要,因为它不能直接使用。

当然,为了完成所有工作,您需要使用一点依赖注入,来注册接口的实现。

答案 1 :(得分:0)

我发现,如果您将身份验证与授权分开,这通常是一个非常简单的答案。身份验证总是最终必须坐在演示文稿前面。它是表示层的前面。它真的必须。

发生身份验证后,将经过身份验证的身份传递到其他层只是另一个模型对象,应该这样对待。将身份验证/授权绑定到所有不同的层作为交叉问题使您的代码更难以在不同的上下文中重用。也使得测试更加困难。