日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

吐槽一下Abp的用户和租户管理模块

發(fā)布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 吐槽一下Abp的用户和租户管理模块 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 背景

ASP.NET Core 基于聲明的訪問控制到底是什么鬼?

聊到基于聲明的身份認(rèn)證將 身份和簽發(fā)機(jī)構(gòu)分離,應(yīng)用程序信任簽發(fā)機(jī)構(gòu),故認(rèn)可簽發(fā)的身份信息。

-----------
ClaimB站:438962688
Name:飯思思_
weibo:538210234
Name:飯思思van
姓名:不詳
籍貫:九江
ClaimsIdentity嗶哩嗶哩賬戶微博賬戶身份證
ClaimsPrincipal


于是我們通常會有如下:

?var?claims?=?new[]?{new?Claim(nameof(ClaimTypes.NameIdentifier),_authData.Data["userId"].ToString(),ClaimValueTypes.String),new?Claim(nameof(ClaimTypes.Name),_authData.Data["userName"].ToString(),ClaimValueTypes.String),new?Claim("profileId",_authData.Data["profileId"].ToString()),new?Claim("positionId",_authData.Data["positionId"].ToString()),new?Claim("organizationId",_authData.Data["organizationId"].ToString()),new?Claim("maxAge",_authData.Data["maxAge"].ToString()),};//?設(shè)置身份卡片內(nèi)容?、身份卡片核心Name,?這個時候HttpContext.Uservar?identity?=?new?ClaimsIdentity(claims,?Scheme.Name,nameof(ClaimTypes.Name),nameof(ClaimTypes.Role));Context.User?=?new?ClaimsPrincipal(identity);

我們現(xiàn)在可以在Action中使用 HttpContext.User.Identity 獲取聲明的身份信息。

當(dāng)我滿心歡喜在Abp vnext中封裝的ICurrentUser接口獲取身份信息,卻無法獲取身份信息。

ICurrentUser 封裝了身份信息,用于獲取有關(guān)當(dāng)前活動的用戶信息,已經(jīng)被Abp框架默認(rèn)注入。
你會在ApplicationSerive、 AbpController看到屬性CurrentUser, 在Abp服務(wù)和控制器中是可以即時使用的。

------


2. Abp用戶、租戶管理

AbpICurrentUser獲取不到常規(guī)HttpContext.User信息,是因為使用了特定的封裝,封裝的方式我不能茍同:

以下是?ICurrentUser?接口的基本屬性:IsAuthenticated?如果當(dāng)前用戶已登錄(已認(rèn)證),則返回?true.?如果用戶尚未登錄,則?Id?和?UserName?將返回?null. Id?(Guid?):?當(dāng)前用戶的Id,如果用戶未登錄,返回?null. UserName?(string):?當(dāng)前用戶的用戶名稱.?如果用戶未登錄,返回?null. TenantId?(Guid?):?當(dāng)前用戶的租戶Id.?對于多租戶?應(yīng)用程序很有用.?如果當(dāng)前用戶未分配給租戶,返回?null. Email?(string):?當(dāng)前用戶的電子郵件地址.?如果當(dāng)前用戶尚未登錄或未設(shè)置電子郵件地址,返回?null. Roles?(string[]):?當(dāng)前用戶的角色.?返回當(dāng)前用戶角色名稱的字符串?dāng)?shù)組. .....

這里面有幾個問題:

①? ? ICurrentUser將用戶id、租戶TenantId硬編碼為GUID
項目原始的身份id、租戶id若不為GUID,則根本不可用。
最差的情況也應(yīng)該用個泛型,由應(yīng)用決定特定身份片段的類型。

②? ? ? ICurrentUser 修改了IsAuthenticated的取值邏輯

  • ASP.NET Core官方認(rèn)證類型不為空,就認(rèn)為用戶認(rèn)證通過。

???//?---?來自asp.netcore源碼:https://github.com/dotnet/runtime/blob/master/src/libraries/System.Security.Claims/src/System/Security/Claims/ClaimsIdentity.cspublic?virtual?bool?IsAuthenticated{get?{?return?!string.IsNullOrEmpty(_authenticationType);?}}.....
  • Abp官方則認(rèn)為UserId不為空,就認(rèn)為用戶認(rèn)證通過。

???//?---截取自abp官方源碼:Volo.Abp.Users.CurrentUserpublic?class?CurrentUser?:?ICurrentUser,?ITransientDependency{private?static?readonly?Claim[]?EmptyClaimsArray?=?new?Claim[0];public?virtual?bool?IsAuthenticated?=>?Id.HasValue;.....}

?③? ICurrentUser修改了UserName的取值邏輯

  • Asp.NetCore檢索聲明信息中ClaimType==某個NameClaimType的Claim值, 作為身份認(rèn)證卡片Identity的Name, 更靈活

  • Abp 檢索聲明信息中ClaimType=="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"的值,作為身份驗證卡片的Name, 硬編碼

Abp 將UserId、TenantId 硬編碼為GUID,已經(jīng)不夠通用;??

另外Abp強(qiáng)行變更了ASP.NET Core基于聲明的身份驗證的取值邏輯,若要我們接受,需要一點學(xué)習(xí)成本。

本次我的項目就是因為UserID、TenantId為String, ?在Abp CurrentUser中轉(zhuǎn)換失敗;Name也取值失敗。??

在項目中就無法愉快地使用Abp ApplicationService、AbpController的CurrentUser屬性。

3. 針對Abp用戶、租戶管理的應(yīng)對方法

我的策略:還是向盡量使用Abp框架,盡量做到【對修改封閉,對擴(kuò)展開放】,

于是我仿照Abp的CurrentUser實現(xiàn)了適合自身項目的CurrentUser:

public?class?CurrentUser:?ITransientDependency {private?static?readonly?Claim[]?EmptyClaimsArray?=?new?Claim[0];public?virtual?string??Id?=>?_principalAccessor.Principal?.Claims?.FirstOrDefault(c?=>?c.Type?==?nameof(ClaimTypes.NameIdentifier))?.Value;public?virtual?string?UserName?=>?_principalAccessor.Principal?.Claims?.FirstOrDefault(c?=>?c.Type?==?nameof(ClaimTypes.Name))?.Value;public?virtual?string?Email?=>?_principalAccessor.Principal?.Claims?.FirstOrDefault(c?=>?c.Type?==?nameof(ClaimTypes.Email))?.Value;public?virtual?string?TenantId?=>?_principalAccessor.Principal?.Claims?.FirstOrDefault(c?=>?c.Type?==?"profileId")?.Value;public?virtual?string[]?Roles?=>?FindClaims("roleId").Select(c?=>?c.Value).ToArray();private?readonly?ICurrentPrincipalAccessor?_principalAccessor;public?CurrentUser(ICurrentPrincipalAccessor?principalAccessor){_principalAccessor?=?principalAccessor;}public?virtual?Claim?FindClaim(string?claimType){return?_principalAccessor.Principal?.Claims.FirstOrDefault(c?=>?c.Type?==?claimType);} }

編寫繼承自ApplicationService、AbpController的通用服務(wù)類、控制器類:

new關(guān)鍵字顯式隱藏從基類繼承的成員

這樣我們既可以使用 Abp框架其他能力,利用new關(guān)鍵詞我們也刻意覆蓋了框架原有的ICurrentUser屬性,

其他同事也不需要額外的認(rèn)知成本就可以開心地像往常一樣使用CurrentUser屬性。


  • 學(xué)完這篇依賴注入,與面試官扯皮就沒有問題了。

  • 我又踩坑了!如何為HttpClient請求設(shè)置Content-Type標(biāo)頭?

  • 臨近年關(guān),修復(fù)ASP.NET Core因瀏覽器內(nèi)核版本引發(fā)的單點登錄故障

  • 手撕公司SSO登錄原理

  • 實戰(zhàn)解讀ASP.NET Core身份認(rèn)證

  • ASP.NET Core應(yīng)用注意這一點,CTO會對你刮目相看

- END -

總結(jié)

以上是生活随笔為你收集整理的吐槽一下Abp的用户和租户管理模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人中文字幕 | 国产麻豆剧果冻传媒白晶晶 | 午夜视频一区二区 | 人人揉人人 | 公交上高潮的丁芷晴 | 欧美理论在线 | 中文字幕一区二区在线观看 | 九色91popny蝌蚪 | 国产100页| 精国产人伦一区二区三区 | 天天干国产 | 亚洲精品福利在线观看 | 91亚洲一区二区三区 | 男女操操视频 | 97自拍偷拍| 熟妇人妻va精品中文字幕 | 激情伊人五月天 | av巨作 | 91视频国产免费 | 国产一级精品毛片 | 亚洲最大的成人网 | 99久热| 毛片视频免费观看 | 欧美国产91 | 99久久影视| 久久这里只有 | 桃色av网站 | 国产成人无码精品久久二区三 | 99热国产精品 | 日本男女激情视频 | 深夜福利在线播放 | 中国毛片网站 | 亚洲毛片儿 | 色偷偷亚洲 | av不卡在线看 | 日韩午夜电影网 | 久久久成人精品一区二区三区 | 国产在线视频福利 | 国语对白一区 | 韩国成人在线 | 少妇伦子伦精品无吗 | 黄色网av| 日本在线免费观看视频 | 狠狠久久综合 | 在线观看不卡的av | 日本性高潮视频 | 超碰888 | 天天爽天天射 | 亚洲成人午夜在线 | 汗汗视频 | 美女三级网站 | 香蕉视频二区 | 人人舔| 国产99页| 伊人春色影院 | 国产精品偷伦视频免费看 | 人人爽人人澡 | 欧美一区日韩一区 | av中文字幕在线免费观看 | 日批视频免费在线观看 | 日日夜夜亚洲 | 亚洲毛片在线免费观看 | 漂亮人妻被黑人久久精品 | 亚洲无人禁区 | 牛牛超碰 | 日韩骚片| 精品国产一二 | 亚洲福利av | 性开放网站 | 伊人影院av| 日韩在线观看网址 | 久久综合色网 | wwwxx在线| 亚洲精品第一页 | 伊人网欧美 | 你懂得在线视频 | av天天网| 欧亚毛片 | 婷婷丁香在线 | 精品人妻无码在线 | 国产91丝袜在线播放0 | xxxxx黄色| 国产成人99久久亚洲综合精品 | 日韩欧美国产一区二区 | 九九这里只有精品视频 | 在线小视频你懂的 | 婷婷综合另类小说色区 | 在线观看91视频 | 国精产品99永久一区一区 | 黄色av大全 | 午夜免费福利小电影 | 黄色一级片在线免费观看 | 欧美国产日韩在线观看 | 婷婷深爱 | 手机看片日韩在线 | 国产福利一区视频 | 一区三区视频 | 女人十八毛片嫩草av | 欧美日韩在线播放 |