我正在使用Entity Framework 5.我们正在使用Microsoft Active Directory进行用户身份验证。我们正在使用适当的n层体系结构,因此在大多数情况下,业务层幸福地没有意识到UI。
现在我们需要保留完整的审计跟踪:每次在数据库上发生任何写操作时,我们都必须将其保存到我们的审计日志中,以及进行更改的人员。
捕捉写作应该相对简单;我将在我的数据上下文中覆盖SaveChanges()
并使用ObjectStateManager
查找所有插入,更新和删除。真正的问题是检测当前用户是谁,因为身份验证是在表示层完成的,业务层DLL将托管在IIS上,为任意数量的客户端进程提供服务。
是否有某种方法可以检测客户端在业务层内使用的身份验证凭据?我绝对不希望将用户ID传递给API中的每个接口!
(FWIW,我也在使用EntityFramework.Extended,据说它有一些原生的AuditLog功能,但是documentation非常不合适。任何有成功使用过这方面经验的人都会有帮助吗?)
答案 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
。