ABP之session

ABP提供了一个IAbpSession接口,能够在不使用ASPNET的session的状况下获取当前用户和租户。IAbpSession还被ABP中的其余结构(如设置和受权系统)彻底集成和使用。api

注入session

IAbpSession一般是注入到所需类的属性,除非在没有会话信息的状况下没法工做。若是咱们使用属性注入,咱们可使用 NullAbpSession.Instance做为默认值,以下图所示:cookie

public class MyClass : ITransientDependency

{

    public IAbpSession AbpSession { get; set; }

 

    public MyClass()

    {

        AbpSession = NullAbpSession.Instance;

    }

 

    public void MyMethod()

    {

        var currentUserId = AbpSession.UserId;

        //...

    }

}

因为身份验证/受权是一个应用层任务,因此建议在应用层和上层使用IAbpSession。这一般不是在域层中完成的。ApplicationService、AbpController、AbpApiController和其余一些基类已经注入了AbpSession,所以,能够直接在应用程序服务方法中使用AbpSession属性。session

Session属性

AbpSession定义了几个关键属性:ide

UserId:当前用户的Id,若是没有当前用户,则为null。若是调用代码被受权,则不能为空。spa

TenantId:当前租户的Id,若是没有当前租户,则为null(若是用户没有登陆或他是主机用户)。日志

ImpersonatorUserId:若是当前会话由另外一个用户模拟,则模拟器用户的Id。若是这不是模拟登陆,则为空。code

ImpersonatorTenantId:若是当前会话由另外一个用户模拟,则模拟用户的租户的Id。若是这不是模拟登陆,则为空。对象

MultiTenancySide:它能够是主机或租户。blog

 

UserId和TenantId是可空的。还有不可空的GetUserId()和GetTenantId()方法。若是肯定有当前用户,能够调用GetUserId()。若是当前用户为空,此方法将引起异常。GetTenantId()也以这种方式工做。接口

模拟器属性不像其余属性那么常见,一般用于审计日志记录目的。

ClaimsAbpSession

ClaimsAbpSession是IAbpSession接口的默认实现。它从当前用户主体的声明中获取会话属性(计算的MultiTenancySide除外)。对于基于cookie的表单身份验证,它从cookie获取值。所以,它彻底集成到ASP.NET的身份验证机制中。

重写当前会话值

在某些特定状况下,可能须要为有限的范围更改/覆盖会话值。在这种状况下,可使用IAbpSession。使用方法以下:

public class MyService
{
    private readonly IAbpSession _session;

    public MyService(IAbpSession session)
    {
        _session = session;
    }

    public void Test()
    {
        using (_session.Use(42, null))
        {
            var tenantId = _session.TenantId; //42
            var userId = _session.UserId; //null
        }
    }
}

Use方法返回IDisposable,必须对其进行处理。一旦处理了返回值,会话值将自动恢复到之前的值。
警告!

始终在using块中使用use方法,如上所示。不然,可能会获得意想不到的session值。

用户标识符

可使用. touseridentifier()扩展方法从IAbpSession建立UserIdentifier对象。因为在许多api中都使用了UserIdentifier,这将简化为当前用户建立UserIdentifier对象。

相关文章
相关标签/搜索