💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 2.2 ABP公共结构 - 会话管理 ### 2.2.1 简介 如果一个应用程序需要登录,则它必须知道当前用户执行了什么操作。因此ASP.NET在展示层提供了一套自己的SESSION会话对象,而ABP则提供了一个可以在任何地方获取当前用户和租户的IAbpSession接口 > 注意:关于IAbpSession接口:需要获取会话信息则必须实现IAbpSession接口。虽然你可以用自己的方式去实现它(IAbpSession),但是它在module-zero项目中已经有了完整的实现。 IAbpSession也被集成且使用在ABP其他模块中,例如:[设置管理](225831),[权限认证](225843)。 ### 2.2.2 注入会话 IAbpSession通常是以属性注入的方式存在于需要它的类中,不需要获取会话信息的类中则不需要它。如果我们使用属性注入方式,我们可以用NullAbpSession.Instance作为默认值来初始化它(IAbpSession),如下所示: ```csharp public class MyClass : ITransientDependency { public IAbpSession AbpSession { get; set; } public MyClass() { AbpSession = NullAbpSession.Instance; } public void MyMethod() { var currentUserId = AbpSession.UserId; //... } } ``` 由于授权是应用层的任务,因此我们应该在应用层和应用层的上一层使用IAbpSession(我们不在领域层使用IAbpSession是很正常的)。 ApplicationService, AbpController 和 AbpApiController 这3个基类已经注入了AbpSession属性,因此在Application Service的实例方法中,能直接使用AbpSession属性。 ### 2.2.3 使用会话属性 AbpSession定义的一些关键属性: + **UserId:** 当前用户的标识ID,如果没有当前用户则为null。如果调用的代码是已授权,那么它不可能为空。 + **TenantId:** 当前租户的标识ID,如果没有当前租户则为null(如果用户没有登录或者他是一个Host用户)。 + **ImpersonatorUserId:** 模拟用户的标识ID,如果当前会话被其他用户模拟登录。如果不是一个模拟登录,那么该值为空。 + **ImpersonatorTenantId:** 模拟用户租户的标识ID,如果当前会话被其他用户模拟登录。如果不是一个模拟登录,那么该值为空。 + **MultiTenancySide:** 可能是Host或Tenant。 UserId和TenantId是可空类型。当然也提供了不为空时获取数据的 **GetUserId()** 和 **GetTenantId()** 方法 。当你确定有当前用户时,你可以使用GetUserId()方法。 如果当前用户为空,使用该方法则会抛出一个异常。GetTenantId()的使用方式和GetUserId()类似。 模拟属性不像其它通用属性一样用于[审计日志](225845)。 ### 2.2.4 User Identifier 你可以使用 **ToUserIdentifier()** 扩展方法从IAbpSession创建一个UserIdentifier对象。因为UserIdentifier被大多数API使用,所以使用该方法可以很方便的为当前用户创建一个UserIdentifier。