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