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對象。

相關文章
相關標籤/搜索