如何检测审计日志的当前用户?

时间:2012-12-06 13:34:13

标签: c# asp.net-mvc entity-framework authentication active-directory

我正在使用Entity Framework 5.我们正在使用Microsoft Active Directory进行用户身份验证。我们正在使用适当的n层体系结构,因此在大多数情况下,业务层幸福地没有意识到UI。

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

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

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

(FWIW,我也在使用EntityFramework.Extended,据说它有一些原生的AuditLog功能,但是documentation非常不合适。任何有成功使用过这方面经验的人都会有帮助吗?)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

<强>更新

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

  

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

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

如果它只是ASP.NET MVC应用程序中包含的DLL,那么它非常简单。

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

  • 您应该确保Thread.CurrentPrincipal设置为与HttpContext.Current.User相同的主体,而不是在业务层中使用HttpContext。

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

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