C# 资源请求验证、服务或业务层职责?

C# 资源请求验证、服务或业务层职责?,c#,.net,asp.net,architecture,C#,.net,Asp.net,Architecture,假设您有一个业务层,将用于前端外部面向web应用程序和后端内部面向web应用程序。外部应用程序将始终包含用户在会话中登录的身份/配置文件。后端应用程序仅适用于内部管理员 在具有以下业务层方法sensitiveInfo Manager.GetResource(id)的场景中。您可以想象,当外部用户调用此方法时,您需要某种验证,以确保传入的id实际上属于请求它的用户。假设您在数据库中具有正确的结构,您将能够在其中建立从请求用户到他们请求的资源的链接。您还可以想象,后端网站管理员应该能够调用相同的方法

假设您有一个
业务层
,将用于前端外部面向web应用程序和后端内部面向web应用程序。外部应用程序将始终包含用户在会话中登录的身份/配置文件。后端应用程序仅适用于内部管理员

在具有以下业务层方法sensitiveInfo Manager.GetResource(id)的场景中。您可以想象,当外部用户调用此方法时,您需要某种验证,以确保传入的id实际上属于请求它的用户。假设您在数据库中具有正确的结构,您将能够在其中建立从请求用户到他们请求的资源的链接。您还可以想象,后端网站管理员应该能够调用相同的方法,但是该用户与资源没有任何关系,但是根据内部管理员的定义,应该能够请求他们想要的任何资源


问题是,如何实现最大程度的重用和最佳的关注点分离?您是否将此验证合并到业务层中,在类级别设置某种标志,表示“验证我”或“不验证我”,具体取决于消费者是谁。或者,您是否将业务层置于
服务层
的前端,授权请求的资源。强制前端应用程序通过服务层传递请求,后端应用程序可以直接进入业务层。

我认为服务层是授权过程最自然的地方


但是,如果您决定将授权功能添加到业务层,那么我将创建一个接口
IAuthorizationAuthority
,其中包含检查权限的所有功能。我将创建两个实现此接口的类(一个用于外部应用程序,一个用于管理应用程序),并使用依赖项注入库,以便您可以决定应使用哪个应用程序级别的实现。

我最初的想法是将其添加为服务层。但是你能确定所有的请求都通过了吗?如果没有,则将其添加到业务层。将是AOP(面向方面编程)的完美候选者。这似乎是一个相当常见的场景,其中许多业务逻辑将被前端和后端系统重用。然而,我们显然不能允许每个人在事情的前端提取语句,例如id。