C# 如何检测审核日志的当前用户?
我在实体框架5中工作。我们正在使用Microsoft Active Directory进行用户身份验证。我们使用的是一个合适的n层架构,因此在大多数情况下,业务层完全不知道UI 现在,我们需要保留完整的审计跟踪:每次数据库上发生任何写操作时,我们都必须将其保存到审计日志中,以及谁进行了更改 捕捉文字应该相对简单;我将在数据上下文中重写C# 如何检测审核日志的当前用户?,c#,asp.net-mvc,entity-framework,authentication,active-directory,C#,Asp.net Mvc,Entity Framework,Authentication,Active Directory,我在实体框架5中工作。我们正在使用Microsoft Active Directory进行用户身份验证。我们使用的是一个合适的n层架构,因此在大多数情况下,业务层完全不知道UI 现在,我们需要保留完整的审计跟踪:每次数据库上发生任何写操作时,我们都必须将其保存到审计日志中,以及谁进行了更改 捕捉文字应该相对简单;我将在数据上下文中重写SaveChanges(),并使用ObjectStateManager查找所有插入、更新和删除。真正的问题将是检测当前用户是谁,因为身份验证在表示层完成,而业务层D
SaveChanges()
,并使用ObjectStateManager
查找所有插入、更新和删除。真正的问题将是检测当前用户是谁,因为身份验证在表示层完成,而业务层DLL将托管在IIS上,为任意数量的客户端进程提供服务
是否有某种方法可以在业务层内检测客户端使用的身份验证凭据?我绝对不想把用户ID传递给API中的每个接口
(FWW,我也使用了EntIrrestFrase.Exchange,它本来就有一些原生的AdditLoad能力,但这是非常不足的。任何有经验的人都能成功地使用它吗?)可以帮助吗?
< P>你可以考虑把最终用户的身份带出带外,而不是把它添加到每个方法签名。 例如,如果您正在使用WCF,则可以创建一个行为,在客户端注入自定义SOAP头,并在服务器端处理自定义头 更新 对该问题的注释似乎暗示DLL是直接从ASP.NET MVC应用程序访问的,而不是通过web服务访问的。我从你的陈述中假设: 业务层DLL将托管在IIS上,为任意数量的客户端进程提供服务 它是从多个ASP.NET MVC应用程序调用的web服务 如果它只是ASP.NET MVC应用程序中包含的一个DLL,那么它非常简单
将包含所连接客户端的标识HttpContext.Current.User
- 您应该确保
设置为与Thread.CurrentPrincipal
相同的主体,而不是在业务层中使用HttpContext 如果您使用的是ASP.NETHttpContext.Current.User
,这将自动为您完成。如果没有,您可能需要手动执行,例如在global.asax中的AuthorizeRequest事件处理程序中RoleProvider
然后,在业务层中,如果您已正确配置了身份验证(例如表单或Windows身份验证),则可以通过
Thread.CurrentPrincipal.identity.Name
访问最终用户身份,然后Thread.CurrentPrincipal
保证是指发出请求的用户。表示层是业务层的可信子系统吗?我认为这是一个内部网应用程序?@Grumbler85我真的不明白这个问题。如何信任它?表示层有一个对BL的引用,而不是相反。那么表示层是作为用户(它委托用户凭据)还是在自己的安全上下文中(某些情况下)起作用_user@yourdomain)?@Shaul,既然你已经在使用Windows身份验证,您应该能够在部署的业务层上简单地使用Windows身份验证,从而了解正在访问该会话的用户。只需禁用匿名访问并要求Windows身份验证。我们使用的是ASP.NET MVC、HTML 5。您将如何做到这一点?您如何在表示层(ASP.NET MVC)和业务层之间进行通信?业务层是否托管在IIS web服务中(表示层如何对最终用户(Windows auth或Forms auth)进行身份验证)?它只是ASP.NET MVC应用程序中包含的一个DLL。我将试一试,看看是否有效。谢谢!@Joe不建议使用Thread.CurrentPrincipal.Identity,因为它是可变的,您必须关注线程和ClaimsPrincipal之间的静态同步。本文对此进行了进一步讨论;这也是一种方法ch稍有不同,但原则上是相同的;然而,这两个示例都在服务层,因此需要进行调整,以便在BContext中保存更改。@Sigex-我阅读了您链接的博客,虽然作者有权发表自己的意见(公开静态可变状态,哦,我的……这从来都不是一个好主意),我不同意。它本质上是线程静态状态,虽然ASP.NET核心开发人员可能做出了不同的设计决策,但我认为在.NET Framework应用程序中使用thread.CurrentPrincipal没有任何问题。在.NET Framework中,CAS可以防止未经授权的代码修改状态,尽管现在大多数代码都以完全信任的方式运行。