Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测审核日志的当前用户?_C#_Asp.net Mvc_Entity Framework_Authentication_Active Directory - Fatal编程技术网

C# 如何检测审核日志的当前用户?

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

我在实体框架5中工作。我们正在使用Microsoft Active Directory进行用户身份验证。我们使用的是一个合适的n层架构,因此在大多数情况下,业务层完全不知道UI

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

捕捉文字应该相对简单;我将在数据上下文中重写
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.Current.User
    相同的主体,而不是在业务层中使用HttpContext

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


然后,在业务层中,如果您已正确配置了身份验证(例如表单或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可以防止未经授权的代码修改状态,尽管现在大多数代码都以完全信任的方式运行。