(译)ABP之Abp Session

原文地址:https://aspnetboilerplate.com/Pages/Documents/Abp-Session

介绍

ABP提供IAbpSession接口获取当前用户和租户信息,而不是使用ASP.NET的Session。在ABP中,IAbpSession也被其他结构完全集成和使用。(例如设置系统和授权系统)。

注入Session

在需要用到IAbpSession的类中,通常是通过属性注入的,除非在没有Session信息时它不能运行。如果我们用属性注入,我们可以用NullAbpSession.Instance作为默认值,如下所示:

public class MyClass : ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public MyClass()
    {
        AbpSession = NullAbpSession.Instance;
    }

    public void MyMethod()
    {
        var currentUserId = AbpSession.UserId;
        //...
    }
}

因为验证/授权是一个应用层任务,建议在应用层和上层模块使用IAbpSession(我们一般在领域层不用它),ApplicationServiceAbpControllerAbpApiController和其它一些基层类已经注入了AbpSession,因此,例如在你的应用服务方法里可以直接使用AbpSession属性。

Session属性

AbpSession定义了一些关键属性:

  • UserId:当前用户的Id,或者没有当前用户时为null,如果调用了授权方法,它就不可能为null。
  • TenantId:当前租户Id,或者没有当前租户时为null(如果用户没有登录或者他不是主用户)。
  • ImpersonatorUserId:如果当前session是由其它用户模拟的,则是模拟用户的Id,如果没有模拟登录,就为null。
  • ImpersonatorTenantId:如果当前session是由其它用户模拟的,则是模拟用户的租户Id,如果没有模拟登录,就为null。
  • MultiTenancySide:它可能是Host或者Tenant。

UserId和TenantId为可空类型,同样也有非空类型的GetUserId()GetTenantId()方法,如果你确定一定存在一个当前用户,那你就可以调用GetUserId()方法;如果当前用户为null,调用这个方法就会抛异常,GetTenantId()方法也类似。

模拟者属性与其他属性不一样,它通常是用来作审计日志用的。

ClaimsAbpSession

ClaimsAbpSession默认实现了IAbpSession接口,它从当前用户的声明中获取session属性(除了MultiTenancySide,它是计算出来的)。对于基于表格验证的cookie,它就是从cookie里获取的,因此,它很好地集成到ASP.Net的验证机制里了。

覆盖当前Session的值

在有些特定情况下,在一定作用域里,你可能需要改变或覆盖session的值。在这种情况下,你可以像下面这样使用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对象,而且它必须释放掉,一旦返回的值是可以释放的,session的值就会自动恢复到它之前的值。

警告

应该像上面的代码一样一定要使用using块,否则,你可能取到的session值不是预期中的值。你可以嵌套Use块,它们还是如你所预期的正常运行。

User Identifier

你可以使用.ToUserIdentifier()扩展方法从IAbpSession创建一个UserIdentifier对象,因为在大部分API里有使用UserIdentifier,这将让你为当前用户创建UserIdentifier对象变得很简单。

posted @ 2017-12-09 16:47  Eric-Lau  阅读(931)  评论(0编辑  收藏  举报