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

Posted

技术标签:

【中文标题】服务层(.NET 应用程序)中的授权和用户信息【英文标题】:Authorization & User info in a Service Layer (.NET application) 【发布时间】:2011-01-06 07:59:24 【问题描述】:

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

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

我想要的是让 ServiceLayer 与“网络东西”(不是访问会话......)隔离开来,但谁知道用户调用它的方法来正确行动。此外,我不知道如何以一种好的方式将该工作与 ASP .NET 身份验证相匹配...... 我正在考虑总结 Service ctor 中的“用户”,以便其方法具有他们需要的“上下文”,这可以工作吗?...我将不胜感激一些迹象或现有的代码 sn-ps。

感谢您的帮助...

【问题讨论】:

【参考方案1】:

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

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

默认方法是认证模块在认证成功时设置Thread.CurrentPrincipal。

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

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

【讨论】:

感谢马克的回答。现在我正在尝试将我的代码测试驱动到一个解决方案,这将是有用的。我会发布我的结果。 @VíctorVelarde 我希望你现在有答案 :) 你有可能发布结果吗?【参考方案2】:

对我来说,我认为如果您让客户端层(您的网站/服务)进行身份验证并让 BL 仅包含业务逻辑,它会更简单,并且更具可扩展性。

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

【讨论】:

谢谢帕迪。那是我的第一个意图,构建某种 IUser,它将在其构造函数中注入到服务中,可用于所有方法。另一种选择是仅将其作为参数传递给将根据用户验证或过滤数据的方法,您怎么看?

以上是关于服务层(.NET 应用程序)中的授权和用户信息的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure 服务的具有身份验证、授权和持久层的 Xamarin 应用程序

n 层架构中的身份验证和授权

如何从 .NET 用户界面将 MySQL 连接信息发送到数据访问层

.NET6之MiniAPI:基于角色的身份验证和授权

使用 ASP.NET Core 的应用程序和用户身份验证

如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?