日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
.NETCore如何全局獲取用戶信息?

鑒于如上場(chǎng)景很常見(jiàn),難道我們沒(méi)發(fā)覺(jué)這樣做很是繁瑣嗎?于是乎,我們想要解放生產(chǎn)力,下面咱們來(lái)聊聊我個(gè)人的想法。

專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)長(zhǎng)白免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

全局獲取用戶信息

既然是全局獲取用戶信息,難道是定義靜態(tài)變量?怎么可能,當(dāng)然是基于請(qǐng)求而獲取,基于靜態(tài)變量必然存在多個(gè)用戶請(qǐng)求覆蓋信息的情況。

那我們到底應(yīng)該怎么全局獲取?首先我們想到的過(guò)濾器比如ActionFilter...等等,但要是我們需要進(jìn)行異步操作呢?貌似又不可行。

根據(jù)我查詢官方文檔,沒(méi)搞錯(cuò)的話,應(yīng)該是從1.0開(kāi)始就給出了異步過(guò)濾器,那就是IAsyncActionFilter,此方法不同于ActionFilter的是,它能夠處理異步操作,同時(shí)它是在模型綁定完成之后執(zhí)行,也就是只有一個(gè)異步方法。

 
 
 
 
  1. public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
  2. {
  3.     await next();
  4. }

接下來(lái)我們定義全局用戶會(huì)話類,如下:

 
 
 
 
  1. public class Session
  2. {
  3.     /// 
  4.     /// 用戶id
  5.     /// 
  6.     public string UserId { get; set; }
  7.     /// 
  8.     /// 用戶名
  9.     /// 
  10.     public string UserName { get; set; }
  11. }

緊接著,比如項(xiàng)目我們使用JWT,則拿到聲明中用戶標(biāo)識(shí)和用戶賬號(hào),那么我們接下來(lái)我們只需要實(shí)現(xiàn)上述異步action過(guò)濾器接口即可,如下:

 
 
 
 
  1. public class AsyncSessionFilter : IAsyncActionFilter
  2. {
  3.     private readonly Session _session;
  4.  
  5.     public AsyncSessionFilter(Session session)
  6.     {
  7.         _session = session;
  8.     }
  9.     
  10.     public async Task OnActionExecutionAsync(
  11.       ActionExecutingContext context,
  12.       ActionExecutionDelegate next)
  13.     {
  14.         var user = context.HttpContext.User;
  15.         _session.UserId = user.FindFirst(JwtRegisteredClaimNames.Sub)?.Value;
  16.         _session.UserName = user.FindFirst(JwtRegisteredClaimNames.UniqueName)?.Value;
  17.         await next();
  18.     }
  19. }

最后,則很簡(jiǎn)單的進(jìn)行上述接口實(shí)現(xiàn)和會(huì)話注入,如下:

 
 
 
 
  1. //注冊(cè)用戶會(huì)話
  2. services.AddScoped();
  3.    
  4. //注冊(cè)全局過(guò)濾器   
  5. services.AddControllers(options =>
  6. {
  7.    options.Filters.Add();
  8. })

在實(shí)際使用中,我們只需要在倉(cāng)儲(chǔ)或服務(wù)層構(gòu)造函數(shù)使用Session,即可拿到用戶名和用戶id,從而最終解決對(duì)于新增和更改操作處理操作人信息,如此是不是來(lái)的更加方便簡(jiǎn)潔呢?

在.NET Core中借助實(shí)現(xiàn)異步IAsyncActionFilter接口而實(shí)現(xiàn)全局獲取用戶信息


文章標(biāo)題:.NETCore如何全局獲取用戶信息?
標(biāo)題路徑:http://m.5511xx.com/article/cccchos.html