0

对于我正在处理的 WCF 项目,我需要为我们保留的实体实现某种审计日志。基本上,审计跟踪将包括 4 个必填字段

  • 创建日期时间
  • 创建用户ID
  • 更新日期时间
  • 更新用户 ID

我正在尝试通过我的 DataAccess 层中的 nHibernate 事件侦听器来实现这一点,因为我认为这不应该在域层中。到目前为止,我已经让 DateTime 的东西按预期工作,但还没有弄清楚如何在事件侦听器中检索用户 ID。理想情况下,我希望将用户 ID 作为某种自定义数据附加到 nHibernate 会话对象。

非常感谢任何建议。

4

2 回答 2

1

.Net 框架已经内置了对上下文用户身份信息的支持:Thread.CurrentPrincipal http://msdn.microsoft.com/en-us/library/system.threading.thread.currentprincipal.aspx

使用可用的 IPrincipal 实现之一或创建您自己的实现 - 这很容易。然后在一些“开始请求”方法中尽早设置属性。

在 ASP.NET 代码中还需要注意 HttpContext.User。

于 2013-01-08T08:13:38.643 回答
1

这是我的做法,但我没有使用 WCF 执行此操作的经验。请注意,这需要引用 System.Web。

    /// <summary>
    ///   Returns the user name of the current user. Gets user name from HttpContext if running as a web app, else WindowsIdentity.
    /// </summary>
    private static string GetUserName()
    {
        var identity = HttpContext.Current == null ? WindowsIdentity.GetCurrent() : HttpContext.Current.User.Identity;
        if (identity == null)
        {
            throw new Exception("Identity could not be determined.");
        }
        // Remove domain name if present
        var s = identity.Name;
        var stop = s.IndexOf("\\", StringComparison.InvariantCultureIgnoreCase);
        return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1).ToUpper() : s;
    }
于 2013-01-08T12:38:27.737 回答