<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
        主站蜘蛛池模板: 亚洲av永久无码制服河南实里| 亚洲美女人黄网成人女| 国产成人精品亚洲2020| 日本最新免费不卡二区在线| 国产成人毛片亚洲精品| 久久噜噜噜久久亚洲va久| 亚洲国产精品日韩av不卡在线| 久久久无码精品亚洲日韩京东传媒| 亚洲国产精品久久久久婷婷软件| 亚洲国产精品久久久久秋霞影院| 337p日本欧洲亚洲大胆人人 | a一级爱做片免费| 亚洲?V无码成人精品区日韩| 国产V亚洲V天堂无码| 国产成人精品亚洲日本在线| 福利免费观看午夜体检区| 亚洲午夜无码久久久久软件 | 国产AⅤ无码专区亚洲AV| 久久青青草原亚洲av无码app| 亚洲av中文无码乱人伦在线观看 | 老司机精品视频免费| 亚洲av午夜精品一区二区三区 | 一级视频在线免费观看| 2021国内精品久久久久精免费| 国产高清视频在线免费观看| 福利片免费一区二区三区| 久久国产高潮流白浆免费观看| 19禁啪啪无遮挡免费网站| 33333在线亚洲| 婷婷亚洲天堂影院| 三上悠亚在线观看免费| 免费人成网站在线播放| 你懂得的在线观看免费视频| 亚洲激情中文字幕| 在线精品免费视频无码的| 中文毛片无遮挡高清免费| 亚洲国产成人九九综合| 亚洲国产一成久久精品国产成人综合 | 香港经典a毛片免费观看看| 亚洲第一黄片大全| 57pao国产成视频免费播放|