Model view controller 属性层和服务层中的MVC 5 Windows身份验证

Model view controller 属性层和服务层中的MVC 5 Windows身份验证,model-view-controller,windows-authentication,service-layer,Model View Controller,Windows Authentication,Service Layer,我有一个三层MVC解决方案:MVC Web-业务层-数据访问层 我在数据库后端有用户和组的自定义表,用户组映射到自定义权限结构。身份验证需要检查用户是否存在,授权需要验证用户可以根据其权限执行哪些操作 我可以通过实现自定义AuthorizeAttribute并询问服务级别用户表中是否存在HttpContext.User.Identity.Name来执行身份验证和授权,还可以根据控制器和操作验证用户权限 但是,当从控制器中的操作调用用户时,服务级别需要再次授权用户。这允许更好地控制用户可以做什么和

我有一个三层MVC解决方案:MVC Web-业务层-数据访问层

我在数据库后端有用户和组的自定义表,用户组映射到自定义权限结构。身份验证需要检查用户是否存在,授权需要验证用户可以根据其权限执行哪些操作

我可以通过实现自定义AuthorizeAttribute并询问服务级别用户表中是否存在HttpContext.User.Identity.Name来执行身份验证和授权,还可以根据控制器和操作验证用户权限

但是,当从控制器中的操作调用用户时,服务级别需要再次授权用户。这允许更好地控制用户可以做什么和不能做什么-例如,根据用户组成员身份,有些字段是只读的或隐藏的

问题是,我最终将在控制器操作的authorized属性和控制器操作本身(通过服务级别)中对用户进行身份验证和授权


这是一个设计问题,比任何其他问题都重要,但我想看看我是否以最佳方式处理这个问题

如果我正确理解您的问题,您需要检查服务层上的用户权限/角色,并在此基础上执行一些逻辑。答案实际上取决于您使用的服务层的类型?它是web API还是基于接口的服务契约。如果您使用的是web api,那么您可以在调用web api控制器操作之前在授权头中注入令牌,这是使用MVC和web api的SPA的通用体系结构。在这种情况下,web api和MVC不需要托管在同一台服务器上,因为您使用的是承载令牌方法。如果您使用的是基于cookie的身份验证,则情况不同。

谢谢您的回答@himanshu。目前,服务层是一个紧密耦合的dll(即没有接口的直接项目引用)。身份验证是Windows身份验证,用户名作为方法参数传递给服务层。在将来,我将要抽象这个服务层。我的问题是,我将复制授权,就像我在AuthorizeAttirbute中所做的那样,然后再在服务层中所做的那样。