2.2 ABP会话

Posted RAINAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.2 ABP会话相关的知识,希望对你有一定的参考价值。

ABP会话

介绍

   如果应用需要登录的话,同样也需要知道当前用户可以执行哪些操作。ABP在展现层提供了会话对象,同时ABP提供了IAbpSession接口获取当前用户和租户,不需要使用ABP会话。

  关于IAbpSession

  为了能活真正的会话信息,IAbpSession接口必须被实现。可以用自己的方式实现它,在                  module-zero工程里有这个接口的完整实现。

  IAbpSession也在ABP其他的结构中完全集成和使用(例如设置系统和授权系统)。

注入会话

  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属性获得实例。

会话属性

  AbpSession定义了一些关键属性:

  • UserId:当前用户的Id或者为null,如果没有当前用户的话。如果调用代码是授权的,那么它就不可能为null。
  • TenantId:当前租户的Id或者为null,如果没有当前租户(如用户没有登录或者当前用户是租主用户)。
  • ImpersonatorUserId:模拟用户的Id,如果当前会话是另一个用户模拟登录。如果不是模拟用户登录则为null。
  • ImpersonatorTenantId:模拟用户租户的Id,如果当前会话是另一个用户模拟登录。如果不是模拟用户登录则为null。
  • MultiTenancySide:它可能是租主或租户。

  UserId和TenantId是nullable类型。有GetUserId() 和GetTenantId()两个非null的方法。如果确定有当前用户,可以调用GetUserId()。如果当前用户是null,这个方法会抛出异常。GetTenantId()方法类似。

  模拟属性并不如其他属性常见,通常用在审计日志。

覆盖当前会话值

  在一些特殊例子中,可能需要更在一个有限的范围改/覆盖属性值。在这种情况下,可以使用IAbpSession.Use方法,如下:

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块,他们可以按预期的工作。

用户标示

  可以使用.ToUserIdentifier()扩展方法从IAbpSession创建用户标示对象。因为用户标示在大多数API中使用,这将简化为当前用户创建一个用户标示。

 

返回主目录

 

以上是关于2.2 ABP会话的主要内容,如果未能解决你的问题,请参考以下文章

会话管理之AbpSession

abp vNext 使用Mysql 数据库

ABP 报错1

ASP.NET CORE 2.2 WEB APP中的会话过期问题

text 会话片段Logan

web代码片段