ABP提供了一個IAbpSession接口,能夠在不使用ASPNET的session的狀況下獲取當前用戶和租戶。IAbpSession還被ABP中的其餘結構(如設置和受權系統)徹底集成和使用。api
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
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對象。