我已经实现了NHibernate自定义上下文(ICurrentSessionContext)。 在这个上下文中,我注入NHibernate会话,所以我有每个调用模式设置Session。 好的,现在我已经制作了一个拦截器,它接受当前登录用户的userId。 现在我这样做:
public ISession CurrentSession()
{
// Get the WCF InstanceContext:
var contextManager = OperationContext.Current.InstanceContext.Extensions.Find<NHibernateContextManager>();
if (contextManager == null)
{
throw new InvalidOperationException(
@"There is no context manager available.
Check whether the NHibernateContextManager is added as InstanceContext extension.
Make sure the service is being created with the NhServiceHostFactory.
This Session Provider is intended only for WCF services.");
}
var session = contextManager.Session;
AuditLogInterceptor interceptor = new AuditLogInterceptor();
if (session == null)
{
session = this._factory.OpenSession(interceptor);
interceptor.Session = session;
contextManager.Session = session;
}
return contextManager.Session;
}
我的AuditLogInterceptor使用UserId,但我不知道如何(从哪里)获取此userId。
答案 0 :(得分:1)
如果您的用户已通过身份验证,则可以使用:
OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name
答案 1 :(得分:0)
我假设当前用户被设置为当前线程的主体?
如果是这样的话,那就是你需要的东西:
var userName = Thread.CurrentPrincipal.Identity.Name;
this article中的一些其他信息可能会有所帮助。