<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:37:13
        文檔

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

        詳解ABP框架中Session功能的使用方法:如果一個應(yīng)用程序需要登錄,則它必須知道當前用戶執(zhí)行了什么操作。因此ASP.NET在展示層提供了一套自己的SESSION會話對象,而ABP則提供了一個可以在任何地方 獲取當前用戶和租戶的IAbpSession接口。 關(guān)于IAbpSession 需要獲取會話信息則必須實現(xiàn)IAbpS
        推薦度:
        導(dǎo)讀詳解ABP框架中Session功能的使用方法:如果一個應(yīng)用程序需要登錄,則它必須知道當前用戶執(zhí)行了什么操作。因此ASP.NET在展示層提供了一套自己的SESSION會話對象,而ABP則提供了一個可以在任何地方 獲取當前用戶和租戶的IAbpSession接口。 關(guān)于IAbpSession 需要獲取會話信息則必須實現(xiàn)IAbpS

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

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

        注入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;
         //...
         }
        }
        
        

        由于授權(quán)是應(yīng)用層的任務(wù),因此我們應(yīng)該在應(yīng)用層和應(yīng)用層的上一層使用IAbpSession(我們不在領(lǐng)域?qū)邮褂肐AbpSession是很正常的)。
        ApplicationService, AbpController 和 AbpApiController 這3個基類已經(jīng)注入了AbpSession屬性,因此在Application Service的實例方法中,能直接使用AbpSession屬性。

        使用Session屬性
        AbpSession定義的一些關(guān)鍵屬性:

      1. UserId: 當前用戶的標識ID,如果沒有當前用戶則為null.如果需要授權(quán)訪問則它不可能為空。
      2. TenantId: 當前租戶的標識ID,如果沒有當前租戶則為null。
      3. MultiTenancySide: 可能是Host或Tenant。
      4. UserId和TenantId是可以為null的。當然也提供了不為空時獲取數(shù)據(jù)的 GetUserId()和GetTenantId() 方法 。當你確定有當前用戶時,你可以使用GetUserId()方法。

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

        ABP如何實現(xiàn)Session的
        目錄代碼:

        201661693415681.png (290×175)

        類圖:

        201661693448325.png (480×264)

        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:實現(xiàn)了空對象模式

        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:獲取會話狀態(tài)

        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());
         }
         }
        }
        
        

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        詳解ABP框架中Session功能的使用方法:如果一個應(yīng)用程序需要登錄,則它必須知道當前用戶執(zhí)行了什么操作。因此ASP.NET在展示層提供了一套自己的SESSION會話對象,而ABP則提供了一個可以在任何地方 獲取當前用戶和租戶的IAbpSession接口。 關(guān)于IAbpSession 需要獲取會話信息則必須實現(xiàn)IAbpS
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日韩国产精品亚洲а∨天堂免| 亚洲精品国产精品乱码在线观看 | 亚洲日韩中文字幕日韩在线 | 四虎亚洲精品高清在线观看| 最近中文字幕2019高清免费| 亚洲神级电影国语版| 99在线观看免费视频| 亚洲理论片在线中文字幕| 国产h肉在线视频免费观看| 亚洲精品第一国产综合精品| 国产成人免费在线| 亚洲娇小性xxxx色| 免费网站看v片在线香蕉| 亚洲AV无码成人精品区狼人影院| 国产伦精品一区二区三区免费迷 | 亚洲AV无码国产精品色| 午夜免费福利影院| 日韩在线视频线视频免费网站| 亚洲国产精品视频| 精品国产污污免费网站| 亚洲国产情侣一区二区三区| 看全色黄大色大片免费久久| free哆拍拍免费永久视频| 亚洲国产香蕉碰碰人人| 国内精品免费视频自在线| 一级毛片免费播放男男| 97亚洲熟妇自偷自拍另类图片| free哆啪啪免费永久| 看成年女人免费午夜视频| 亚洲AV永久精品爱情岛论坛| 亚洲网站免费观看| 国产成人亚洲精品蜜芽影院| 国产精品亚洲аv无码播放| 青娱乐免费视频在线观看| 豆国产96在线|亚洲| 亚洲欧洲日产国码无码网站| 国产精品久久久久久久久久免费 | 中文字幕不卡免费视频| 亚洲人成网男女大片在线播放| 亚洲国产婷婷综合在线精品| 久久久久久一品道精品免费看|