• 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对象。

  • 相关阅读:
    第10组 Alpha冲刺 (4/6)(组长)
    Android菜鸟成长记10 ListVew
    Android菜鸟成长记3activity类
    Android菜鸟成长记2内部类
    Android菜鸟成长记7 Android的五大布局
    Android菜鸟成长记4button点击事件
    Android菜鸟成长记8 布局实践(微信界面的编写)
    Android菜鸟成长记9 selector的用法
    Android菜鸟成长记6 网络连接的检查
    Android菜鸟成长记5ADB和sqllite
  • 原文地址:https://www.cnblogs.com/yixuanhan/p/10647610.html
Copyright © 2020-2023  润新知