Asp.net mvc n层网站中的用户身份验证应该存在于哪一层

Asp.net mvc n层网站中的用户身份验证应该存在于哪一层,asp.net-mvc,architecture,asp.net-identity,n-tier-architecture,Asp.net Mvc,Architecture,Asp.net Identity,N Tier Architecture,我阅读了不同的建筑书籍,比如这本: 现在我正在用ASP.NETMVC作为表示层构建一个新的n层网站。 我的问题是,如果我将使用,我应该在哪个层/层上实现用户身份验证 我认为这应该是交叉关注点,因为我需要检查用户是否被授权或验证以访问某些功能,并且我可能在许多层上使用用户名,例如业务层、服务层和表示层 而且还认为最好将其放在表示层中,因为表示层是MVC,可以很容易地从那里处理ASP身份,并允许我轻松地使用[Authorization]和[AllowAnonymous] 我知道这个问题的答案取决于许

我阅读了不同的建筑书籍,比如这本: 现在我正在用ASP.NETMVC作为表示层构建一个新的n层网站。 我的问题是,如果我将使用,我应该在哪个层/层上实现用户身份验证

我认为这应该是交叉关注点,因为我需要检查用户是否被授权或验证以访问某些功能,并且我可能在许多层上使用用户名,例如业务层、服务层和表示层

而且还认为最好将其放在表示层中,因为表示层是MVC,可以很容易地从那里处理ASP身份,并允许我轻松地使用[Authorization]和[AllowAnonymous]


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

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

您必须将抽象与实现分开

抽象(接口)定义了您需要能够向身份验证服务提出的问题。此接口由应用程序的所有其他部分使用,这些部分将使用您的身份验证服务。这意味着您的抽象必须定义在可以被应用程序的其他部分引用的地方。我的建议是将其放在业务层,因为接口中的方法(换句话说,“您想向服务提出的问题”)通常与业务相关。另一个建议是将其放在核心层(如果有)

这就给我们留下了接口的实现。我会在最容易的地方实现它。你能在业务层做吗,好的。您是否需要使用MVC中的标识类,也很好,请将其放在那里。你把它放在哪里并不重要,因为它不是直接使用的


当然,要完成这些工作,您确实需要使用一点依赖注入,为接口注册您的实现。

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


在进行身份验证之后,将经过身份验证的标识向下传递到其他层只是另一个模型对象,应该这样处理。将身份验证/授权绑定到所有不同的层作为一个交叉关注点,这会使您的代码更难在不同的上下文中重用。这也使得测试更加困难。

什么是横切层?我听说过横切关注点,但没有听说过具有该名称的特定层。@Maarten是的,我指的是横切关注点或通用组件