Abp 会话

介绍

ASP.NET Boilerplate提供了一个IAbpSession接口,用于在使用ASP.NET会话的情况下获取当前用户和租户IAbpSession也完全集成并由ASP.NET Boilerplate中的其他结构使用,例如 设置和 授权系统。

注入会话

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和TenantId可以为还有不可为空的 GetUserId()GetTenantId()方法。如果您确定有当前用户,可以调用GetUserId()。如果当前用户为null,则此方法将引发异常。GetTenantId()也以这种方式工作。

模仿属性不像其他属性那样常见,通常用于审计日志记录

ClaimsAbpSession

ClaimsAbpSession是IAbpSession接口默认实现它从当前用户的主体的声明获取会话属性(MultiTenancySide除外,它是计算的)。对于基于cookie的表单身份验证,它从cookie获取值。因此,它完全集成到ASP.NET的身份验证机制中。

覆盖当前会话值

在某些特定情况下,您可能需要更改/覆盖有限范围的会话值。在这种情况下,您可以使用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,必须将其处理掉一旦处理了返回值,会话值将自动恢复 为先前的值。

警告!

始终在使用块中使用Use方法,如上所示。否则,您可能会收到意外的会话值。您可以使用嵌套的使用块,它们将按预期工作。

用户标识符

您可以使用.ToUserIdentifier()扩展方法从IAbpSession创建UserIdentifier对象。由于UserIdentifier用于许多API,因此将简化为当前用户创建UserIdentifier对象的过程。

nidie.com.cn - 用心与你沟通