【问题标题】:How to detect the current user for an audit log?如何检测当前用户的审核日志?
【发布时间】:2012-12-06 13:34:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 表示层是业务层的可信子系统吗?
  • 我认为这是一个 Intranet 应用程序?
  • @Grumbler85 我不太明白这个问题。怎么会被信任?表示层引用了 BL,而不是相反。
  • 表现层是充当用户(所以它是委托用户凭据)还是在自己的安全上下文中充当(some_user@yourdomain)?
  • @Shaul,由于您已经在使用 Windows 身份验证,您应该能够在部署的业务层上简单地使用 Windows 身份验证,从而知道正在访问该会话的用户。只需禁用匿名访问并要求 Windows 身份验证。

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


【解决方案1】:

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

【讨论】:

    【解决方案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 的身份访问最终用户身份。

    【讨论】:

    • 我们使用的是 ASP.NET MVC,HTML 5。你会怎么做?
    • 您如何在表示层 (ASP.NET MVC) 和业务层之间进行通信?业务层是否托管在 IIS Web 服务中(表示层如何对最终用户进行身份验证(Windows auth 或 Forms auth)?
    • 它只是一个包含在 ASP.NET MVC 应用程序中的 DLL。我会试一试,看看是否有效。谢谢!
    • @Joe 不建议使用 Thread.CurrentPrincipal.Identity,因为它是可变的,并且您必须关心在 Thread 和 ClaimsPrincipal 之间同步静态状态。本文进一步讨论了它; davidpine.net/blog/principal-architecture-changes 同样,这种方法略有不同,但原则上是相同的; gist.github.com/cherrydev/5c7168c8947eb1a1b5b8 然而,这两个例子都在服务层,因此需要调整它以供 theDbContext 中的 SaveChanges 使用。
    • @Sigex - 我阅读了您链接的博客,虽然作者有权发表他的意见(公开静态可变状态,哦,我的......这从来都不是一个好主意),我不同意.它本质上是线程静态状态,虽然 ASP.NET Core 开发人员可能做出了不同的设计决策,但我认为在 .NET Framework 应用程序中使用 Thread.CurrentPrincipal 没有任何问题。在 .NET Framework 中,CAS 可以防止未经授权的代码修改状态,尽管如今大多数代码都在完全信任的情况下运行。
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2019-02-21
    相关资源
    最近更新 更多