3

我正在使用 Entity Framework 5。我们使用 Microsoft Active Directory 进行用户身份验证。我们正在使用适当的 n 层架构,因此在大多数情况下,业务层完全不知道 UI。

现在我们需要保留完整的审计跟踪:每次数据库上发生任何写操作时,我们都必须将其保存到审计日志中,以及进行更改的人。

抓写应该比较简单;我将SaveChanges()在我的数据上下文中覆盖并使用ObjectStateManager查找所有插入、更新和删除。真正的问题将是检测当前用户是谁,因为身份验证是在表示层上完成的,而业务层 DLL 将托管在 IIS 上,为任意数量的客户端进程提供服务。

是否有某种方法可以在业务层内部检测客户端使用的身份验证凭据?我绝对不想将用户 ID 传递给 API 中的每个接口!

(FWIW,我也在使用 EntityFramework.Extended,据说它具有一些本机 AuditLog 功能,但文档严重不足。任何有任何成功使用此经验的人都可以帮助吗?)

4

2 回答 2

3

如果您已经适当地配置了身份验证(例如表单或 Windows 身份验证),则Thread.CurrentPrincipal可以保证引用发出请求的用户。

于 2012-12-06T13:46:09.340 回答
2

您可以考虑将最终用户的身份带外传递,而不是将其添加到每个方法签名中。

例如,如果您使用 WCF,您可以创建一个行为,在客户端注入自定义 SOAP 标头,并在服务器端处理自定义标头。

更新

对该问题的评论似乎暗示 DLL 是从 ASP.NET MVC 应用程序直接访问的,而不是通过 Web 服务。我从你的陈述中假设:

业务层 DLL 将托管在 IIS 上,为任意数量的客户端进程提供服务

它是从多个 ASP.NET MVC 应用程序调用的 Web 服务。

如果它只是包含在您的 ASP.NET MVC 应用程序中的一个 DLL,则非常简单。

  • HttpContext.Current.User将包含已连接客户端的身份。

  • 而不是在业务层中使用 HttpContext,您应该确保将Thread.CurrentPrincipal其设置为与HttpContext.Current.User.

    如果您使用的是 ASP.NET RoleProvider,这将自动为您完成。如果没有,您可能需要手动完成,例如在 global.asax 中的 AuthorizeRequest 事件处理程序中。

然后在业务层中,您访问最终用户身份为Thread.CurrentPrincipal.Identity.Name.

于 2012-12-06T13:38:28.423 回答