ABP之session


ABP提供了一個IAbpSession接口,可以在不使用ASPNET的session的情況下獲取當前用戶和租戶。IAbpSession還被ABP中的其他結構(如設置和授權系統)完全集成和使用。

注入session

IAbpSession通常是注入到所需類的屬性,除非在沒有會話信息的情況下無法工作。如果我們使用屬性注入,我們可以使用 NullAbpSession.Instance作為默認值,如下圖所示:

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屬性

AbpSession定義了幾個關鍵屬性:

UserId:當前用戶的Id,如果沒有當前用戶,則為null。如果調用代碼被授權,則不能為空。

TenantId:當前租戶的Id,如果沒有當前租戶,則為null(如果用戶沒有登錄或他是主機用戶)。

ImpersonatorUserId:如果當前會話由另一個用戶模擬,則模擬器用戶的Id。如果這不是模擬登錄,則為空。

ImpersonatorTenantId:如果當前會話由另一個用戶模擬,則模擬用戶的租戶的Id。如果這不是模擬登錄,則為空。

MultiTenancySide:它可以是主機或租戶。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM