服务层中的授权和用户信息(.NET应用程序)

Víc*_*rde 9 c# architecture security service domain-driven-design

我目前正在.NET环境中使用企业应用程序(n-layered),我想知道在BussinessLayer(BL)中管理身份验证/授权+数据过滤的最佳方法.我们将使用来自多个接口(ASP.NET应用程序和Web服务)的BL,我认为我的ServiceLayer应该完成这项工作,但我找不到最好的方法.

我想它可能是这样的:(1)用户可能使用FormsAuthentication进行身份验证(ASP.NET Web客户端).(2)ASP .NET代码(Controller/CodeBehind)实现一个服务来完成一些用户案例,以某种方式传递'用户'.(3)服务方法检查"用户"是否存在(认证)和他的角色(授权)以验证他是否可以调用该方法.如果未经过身份验证或授权,则抛出异常.(4)服务使用存储库+其他服务+完成工作所需的任何服务.如果需要某种细粒度过滤(例如,用户仅对某些项目具有权限),则服务会自动应用它.

我想要的是将ServiceLayer与'web stuff'隔离(不访问会话...),但是谁知道User调用其方法才能正常运行.此外,我不知道如何以良好的方式将该工作与ASP .NET身份验证相匹配......我正在考虑将服务ctor中的"用户"总结,以便其方法具有所需的"上下文",那工作?...我会很感激一些迹象或现有的代码片段.

谢谢您的帮助...

Mar*_*ann 12

首先,身份验证和授权是两个独立的事情.你的问题意味着你已经知道这一点,但我只是想明确一下.

身份验证应该在应用程序边界发生(例如,Web应用程序中的表单身份验证).

默认方法是Authentication模块在成功验证后设置Thread.CurrentPrincipal.

通常,IPrincipal是在.NET中建模用户上下文的标准基础.例如,HttpContext.User是一个IPrincipal.

在您的域模型和数据访问模块中,您可以使用Thread.CurrentPrincipal来实现授权逻辑.这允许您彼此独立地更改身份验证和授权.