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

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

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

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

谢谢您的帮助…

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

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

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

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

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

对我来说,如果你让客户层(你的网站/服务)进行身份validation并让BL只包含业务逻辑,我认为它既简单又可扩展。

如果您需要在BL中引用当前用户,您可以考虑使用“包装”某些用户身份信息的接口,这可以从各个UI层传递。