Asp.net mvc 如何使用NHibernate Envers记录当前用户

Asp.net mvc 如何使用NHibernate Envers记录当前用户,asp.net-mvc,nhibernate,nhibernate-envers,Asp.net Mvc,Nhibernate,Nhibernate Envers,我已经了解了如何将当前用户的用户名记录在Envers的修订实体表中。然而,几乎没有什么信息,而我设法找到的信息也没有那么大的帮助 我有一个修订实体和侦听器,如下所示: [RevisionEntity(typeof(EnversRevisionListener))] public class EnversRevisionEntity : DefaultRevisionEntity { public virtual string UserName { get; set; } } publi

我已经了解了如何将当前用户的用户名记录在Envers的修订实体表中。然而,几乎没有什么信息,而我设法找到的信息也没有那么大的帮助

我有一个修订实体和侦听器,如下所示:

[RevisionEntity(typeof(EnversRevisionListener))]
public class EnversRevisionEntity : DefaultRevisionEntity
{
    public virtual string UserName { get; set; }
}

public class EnversRevisionListener : IRevisionListener
{
    private string _userName = "unknown";

    public EnversRevisionListener(string userName)
        : base()
    {
        _userName = userName;
    }

    public void NewRevision(object revisionEntity)
    {
        var casted = revisionEntity as EnversRevisionEntity;

        if (casted != null)
        {
            casted.UserName = _userName;
        }
    }
}
我想在ASP.NET环境中使用这两个。配置和会话工厂只创建一次,因为这是一项昂贵的操作。对于每个事务,将打开一个新会话

从这个问题和这个相关问题中,我了解到在配置nHibernate时可以向侦听器注册用户名

但是,这对我来说还不够好,因为这会为每个事务首先注册连接到应用程序的人的用户名

我需要能够向侦听器提供与特定事务相关的用户名

以前,我使用nHibernate的更新前和更新后事件侦听器使用poor man的审计。在这里,这些侦听器也与会话工厂关联,而不是与会话关联。因此,我切换到旧式拦截器,它可以与
OpenSession
中的会话相关联。这允许我将当前用户添加到拦截器


然而,我不知道如何为Envers解决同样的问题。我希望有人能帮忙。

您可以使用Thread.CurrentPrinicpal属性()。ASP.NET成员机制将其设置为与当前登录的用户关联的标识

在我的情况下,HttpContext.Current.useren
Thread.CurrentPrincipal
之间是否存在差异?我认为没有,但HttpContext.user严格受http环境约束。Thread.CurrentPrincipal更通用,也可以与win forms应用程序一起使用。根据本文,我认为你是对的,因为我没有手动更改任何一个值: