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

时间:2010-01-18 11:19:24

标签: c# security architecture 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中的“用户”,以便它的方法具有他们需要的“上下文”,是否可行?...我会感谢一些迹象或现有的代码片段。

感谢您的帮助......

2 个答案:

答案 0 :(得分:11)

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

身份验证应该在应用程序边界进行(例如,Web应用程序中的表单身份验证)。

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

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

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

答案 1 :(得分:2)

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

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