婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解ABP框架中Session功能的使用方法

詳解ABP框架中Session功能的使用方法

熱門標簽:外呼電話機器人成本 臨沂智能電話機器人加盟 聯通官網400電話辦理 蘇州如何辦理400電話 百應電話機器人外呼系統 地圖標注軟件免費下載 400電話辦理怎么樣 西寧呼叫中心外呼系統線路商 網絡電話外呼系統上海

如果一個應用程序需要登錄,則它必須知道當前用戶執行了什么操作。因此ASP.NET在展示層提供了一套自己的SESSION會話對象,而ABP則提供了一個可以在任何地方
獲取當前用戶和租戶的IAbpSession接口。

關于IAbpSession
需要獲取會話信息則必須實現IAbpSession接口。雖然你可以用自己的方式去實現它(IAbpSession),但是它在module-zero項目中已經有了完整的實現。

注入Session
IAbpSession通常是以屬性注入的方式存在于需要它的類中,不需要獲取會話信息的類中則不需要它。如果我們使用屬性注入方式,我們可以用
NullAbpSession.Instance作為默認值來初始化它(IAbpSession),如下所示:

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屬性。

使用Session屬性
AbpSession定義的一些關鍵屬性:

  • UserId: 當前用戶的標識ID,如果沒有當前用戶則為null.如果需要授權訪問則它不可能為空。
  • TenantId: 當前租戶的標識ID,如果沒有當前租戶則為null。
  • MultiTenancySide: 可能是Host或Tenant。

UserId和TenantId是可以為null的。當然也提供了不為空時獲取數據的 GetUserId()和GetTenantId() 方法 。當你確定有當前用戶時,你可以使用GetUserId()方法。

如果當前用戶為空,使用該方法則會拋出一個異常。GetTenantId()的使用方式和GetUserId()類似。

ABP如何實現Session的
目錄代碼:

類圖:

IAbpSession:IAbpSession接口

using Abp.MultiTenancy;

namespace Abp.Runtime.Session
{
  public interface IAbpSession
  {
    long? UserId { get; }
    int? TenantId { get; }
    MultiTenancySides MultiTenancySide { get; }
    long? ImpersonatorUserId { get; }
    int? ImpersonatorTenantId { get; }
  }
}

NullAbpSession:實現了空對象模式

using Abp.MultiTenancy;

namespace Abp.Runtime.Session
{
  /// summary>
  /// Implements null object pattern for see cref="IAbpSession"/>.
  /// /summary>
  public class NullAbpSession : IAbpSession
  {
    /// summary>
    /// Singleton instance.
    /// /summary>
    public static NullAbpSession Instance { get { return SingletonInstance; } }
    private static readonly NullAbpSession SingletonInstance = new NullAbpSession();

    /// inheritdoc/>
    public long? UserId { get { return null; } }

    /// inheritdoc/>
    public int? TenantId { get { return null; } }

    public MultiTenancySides MultiTenancySide { get { return MultiTenancySides.Tenant; } }
    
    public long? ImpersonatorUserId { get { return null; } }
    
    public int? ImpersonatorTenantId { get { return null; } }

    private NullAbpSession()
    {

    }
  }
}

ClaimsAbpSession:獲取會話狀態

using System;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using Abp.Configuration.Startup;
using Abp.MultiTenancy;
using Abp.Runtime.Security;

namespace Abp.Runtime.Session
{
  /// summary>
  /// Implements see cref="IAbpSession"/> to get session properties from claims of see cref="Thread.CurrentPrincipal"/>.
  /// /summary>
  public class ClaimsAbpSession : IAbpSession
  {
    private const int DefaultTenantId = 1;

    public virtual long? UserId
    {
      get
      {
        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
        if (claimsPrincipal == null)
        {
          return null;
        }

        var claimsIdentity = claimsPrincipal.Identity as ClaimsIdentity;
        if (claimsIdentity == null)
        {
          return null;
        }

        var userIdClaim = claimsIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
        if (userIdClaim == null || string.IsNullOrEmpty(userIdClaim.Value))
        {
          return null;
        }

        long userId;
        if (!long.TryParse(userIdClaim.Value, out userId))
        {
          return null;
        }

        return userId;
      }
    }

    public virtual int? TenantId
    {
      get
      {
        if (!_multiTenancy.IsEnabled)
        {
          return DefaultTenantId;
        }

        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
        if (claimsPrincipal == null)
        {
          return null;
        }

        var tenantIdClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.TenantId);
        if (tenantIdClaim == null || string.IsNullOrEmpty(tenantIdClaim.Value))
        {
          return null;
        }

        return Convert.ToInt32(tenantIdClaim.Value);
      }
    }

    public virtual MultiTenancySides MultiTenancySide
    {
      get
      {
        return _multiTenancy.IsEnabled  !TenantId.HasValue
          ? MultiTenancySides.Host
          : MultiTenancySides.Tenant;
      }
    }

    public virtual long? ImpersonatorUserId
    {
      get
      {
        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
        if (claimsPrincipal == null)
        {
          return null;
        }

        var impersonatorUserIdClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorUserId);
        if (impersonatorUserIdClaim == null || string.IsNullOrEmpty(impersonatorUserIdClaim.Value))
        {
          return null;
        }

        return Convert.ToInt64(impersonatorUserIdClaim.Value);
      }
    }

    public virtual int? ImpersonatorTenantId
    {
      get
      {
        if (!_multiTenancy.IsEnabled)
        {
          return DefaultTenantId;
        }

        var claimsPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
        if (claimsPrincipal == null)
        {
          return null;
        }

        var impersonatorTenantIdClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorTenantId);
        if (impersonatorTenantIdClaim == null || string.IsNullOrEmpty(impersonatorTenantIdClaim.Value))
        {
          return null;
        }

        return Convert.ToInt32(impersonatorTenantIdClaim.Value);
      }
    }

    private readonly IMultiTenancyConfig _multiTenancy;

    /// summary>
    /// Constructor.
    /// /summary>
    public ClaimsAbpSession(IMultiTenancyConfig multiTenancy)
    {
      _multiTenancy = multiTenancy;
    }
  }
}

AbpSessionExtensions:IAbpSession擴展方法

using System;

namespace Abp.Runtime.Session
{
  /// summary>
  /// Extension methods for see cref="IAbpSession"/>.
  /// /summary>
  public static class AbpSessionExtensions
  {
    /// summary>
    /// Gets current User's Id.
    /// Throws see cref="AbpException"/> if see cref="IAbpSession.UserId"/> is null.
    /// /summary>
    /// param name="session">Session object./param>
    /// returns>Current User's Id./returns>
    public static long GetUserId(this IAbpSession session)
    {
      if (!session.UserId.HasValue)
      {
        throw new AbpException("Session.UserId is null! Probably, user is not logged in.");
      }

      return session.UserId.Value;
    }

    /// summary>
    /// Gets current Tenant's Id.
    /// Throws see cref="AbpException"/> if see cref="IAbpSession.TenantId"/> is null.
    /// /summary>
    /// param name="session">Session object./param>
    /// returns>Current Tenant's Id./returns>
    /// exception cref="AbpException">/exception>
    public static int GetTenantId(this IAbpSession session)
    {
      if (!session.TenantId.HasValue)
      {
        throw new AbpException("Session.TenantId is null! Possible problems: No user logged in or current logged in user in a host user (TenantId is always null for host users).");
      }

      return session.TenantId.Value;
    }

    /// summary>
    /// Creates see cref="UserIdentifier"/> from given session.
    /// Returns null if see cref="IAbpSession.UserId"/> is null.
    /// /summary>
    /// param name="session">The session./param>
    public static UserIdentifier ToUserIdentifier(this IAbpSession session)
    {
      return session.UserId == null
        ? null
        : new UserIdentifier(session.TenantId, session.GetUserId());
    }
  }
}

您可能感興趣的文章:
  • 解析ABP框架中的數據傳輸對象與應用服務
  • ABP框架中的日志功能完全解析
  • 詳解ABP框架的參數有效性驗證和權限驗證
  • 詳解ABP框架中領域層的領域事件Domain events
  • 解析ABP框架中的事務處理和工作單元
  • 詳解ABP框架中的數據過濾器與數據傳輸對象的使用
  • 解析ABP框架領域層中的實體類與倉儲類
  • 詳解ABP框架中的日志管理和設置管理的基本配置
  • ABP框架的基礎配置及依賴注入講解
  • ABP框架的體系結構及模塊系統講解
  • ASP.NET樣板項目ABP框架的特性總結
  • 基于ASP.NET MVC的ABP框架入門學習教程
  • ABP框架中導航菜單的使用及JavaScript API獲取菜單的方法

標簽:海西 平涼 中衛 清遠 臨夏 甘肅 聊城 慶陽

巨人網絡通訊聲明:本文標題《詳解ABP框架中Session功能的使用方法》,本文關鍵詞  詳解,ABP,框架,中,Session,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解ABP框架中Session功能的使用方法》相關的同類信息!
  • 本頁收集關于詳解ABP框架中Session功能的使用方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产.欧美.日韩| 精品理论电影在线观看 | 欧美精品v国产精品v日韩精品| 国产精品国产三级国产普通话三级| 91久久精品国产91性色tv| 91一区二区在线观看| 91猫先生在线| 欧美三级电影精品| 91精品午夜视频| 久久综合九色综合久久久精品综合| 欧美色窝79yyyycom| 日韩免费成人网| 亚洲国产精品二十页| 一级女性全黄久久生活片免费| 亚洲va欧美va人人爽午夜| 日本亚洲一区二区| 国产91精品在线观看| 在线一区二区三区四区五区| 久久久青草青青国产亚洲免观| 欧美成人精品福利| 亚洲日本免费电影| 午夜视频在线观看一区二区三区| 午夜影院在线观看欧美| 奇米影视在线99精品| 91在线你懂得| 欧美国产日韩精品免费观看| 国产亚洲成av人在线观看导航| 在线观看不卡视频| 91丨九色丨国产丨porny| 欧美日本在线看| 欧美一级午夜免费电影| 国产欧美日韩在线看| 精品sm在线观看| 亚洲国产日韩综合久久精品| 亚洲国产精品久久人人爱蜜臀| 亚洲一区二区美女| 五月激情六月综合| eeuss影院一区二区三区| 欧美二区在线观看| 国产精品精品国产色婷婷| 青青草97国产精品免费观看无弹窗版| 日韩在线a电影| 色婷婷久久久久swag精品| 日韩精品一区二区三区四区 | 日本成人超碰在线观看| a亚洲天堂av| 夜夜精品视频一区二区| 国产一区美女在线| 欧美一三区三区四区免费在线看| 久久精品人人做人人爽人人| 一区二区三区在线观看动漫| 国产**成人网毛片九色 | 色综合久久天天| 亚洲国产日韩精品| 在线播放日韩导航| 视频一区中文字幕| 欧美日韩二区三区| 免费成人在线网站| 麻豆精品视频在线观看免费| 欧美一区午夜视频在线观看 | 日韩国产一二三区| 日韩一级二级三级精品视频| 日本aⅴ精品一区二区三区| 欧美一级在线免费| 国产精品亚洲一区二区三区在线| 91精品国产免费| 国产精品综合一区二区三区| 国产精品传媒入口麻豆| 在线观看国产一区二区| 五月综合激情网| 国产精品国产三级国产三级人妇 | 国产拍欧美日韩视频二区| 高清av一区二区| 日本不卡一区二区三区| 国产清纯在线一区二区www| 99久久亚洲一区二区三区青草 | 精品99一区二区| 91在线观看污| 国产乱码精品一区二区三区av| 欧美成人女星排名| 精品一区二区三区在线播放视频| 91超碰这里只有精品国产| 久久久精品综合| 热久久国产精品| 91国偷自产一区二区三区成为亚洲经典 | av综合在线播放| 4438x成人网最大色成网站| 国产精品久久综合| 麻豆精品视频在线| 色综合天天综合网天天看片| 国产精品久久久久久久久快鸭| 亚洲女同一区二区| 波多野结衣中文字幕一区二区三区| 欧美精品乱码久久久久久| 午夜精品123| 欧美一区二区福利在线| 九色综合国产一区二区三区| 日韩精品一区二区三区在线播放| 奇米色777欧美一区二区| 欧美一级一级性生活免费录像| 免费观看一级特黄欧美大片| 欧美电影免费观看高清完整版| 三级不卡在线观看| 久久久欧美精品sm网站| kk眼镜猥琐国模调教系列一区二区| 久久久久久久网| 国产精品综合一区二区三区| 亚洲色图欧洲色图| 制服丝袜国产精品| 9i看片成人免费高清| 午夜av一区二区| 亚洲黄色小视频| 欧美国产精品中文字幕| 欧美艳星brazzers| 不卡的av电影| av一区二区三区黑人| 黄色日韩三级电影| 久久电影网站中文字幕| 日本伊人精品一区二区三区观看方式| 日韩你懂的电影在线观看| 亚洲蜜臀av乱码久久精品| 久久亚洲精华国产精华液 | 奇米影视在线99精品| 亚洲一区二三区| 亚洲一区二区精品久久av| 一区二区三区欧美日韩| 亚洲少妇屁股交4| 亚洲高清免费在线| 亚洲成人综合在线| 三级欧美韩日大片在线看| 性久久久久久久久久久久| 日精品一区二区| 成人精品视频网站| 91一区二区在线观看| 欧美日韩国产天堂| 日韩你懂的在线播放| 一级日本不卡的影视| 久久99精品久久久久久动态图| 大陆成人av片| 亚洲成av人片一区二区| 久久亚洲综合色一区二区三区| 国产激情视频一区二区三区欧美 | 7777精品伊人久久久大香线蕉完整版| 国产精品水嫩水嫩| 91精品啪在线观看国产60岁| 国产高清亚洲一区| 日韩二区三区四区| 亚洲精品一卡二卡| 国产女主播一区| 欧美丰满少妇xxxxx高潮对白| 日韩电影在线一区| 一本到三区不卡视频| 欧美一区二区三区在线看| 日本高清不卡aⅴ免费网站| 国产午夜精品一区二区三区视频| 欧美一区二区在线播放| 26uuu国产在线精品一区二区| 精品一区二区在线播放| 在线观看中文字幕不卡| 亚洲一区二区高清| 欧美日韩三级在线| 欧美久久高跟鞋激| 热久久一区二区| 日韩欧美在线123| 久久国产尿小便嘘嘘尿| 91麻豆精品国产91久久久久久 | 91猫先生在线| 天天做天天摸天天爽国产一区| ...中文天堂在线一区| 亚洲欧美一区二区久久 | 亚洲综合免费观看高清完整版| 亚洲美女一区二区三区| 国产成人一级电影| 久久精品国产免费| 欧美视频一区二区三区| 日本一区二区免费在线| 麻豆成人91精品二区三区| 91亚洲精品久久久蜜桃| 日韩欧美不卡在线观看视频| 亚洲激情网站免费观看| 成人午夜电影网站| 国产精品美女久久福利网站| 日本欧洲一区二区| 欧美日韩二区三区| 一区二区三区国产精品| 91在线观看美女| 丁香激情综合五月| 久久美女艺术照精彩视频福利播放 | 久久夜色精品一区| 亚洲女同女同女同女同女同69| 欧美视频中文字幕| 亚洲18女电影在线观看| 91黄色激情网站| 国产麻豆精品theporn| 国产精品乱人伦一区二区| 精品一二三四在线| 久久精品人人做人人爽97| 亚洲欧洲日产国产综合网| 成人精品国产一区二区4080| 国产精品久久二区二区|