簡體   English   中英

“授權”屬性與“角色”是否考慮了“索賠”

[英]does Authorize attribute with Roles take Claims into account

我嘗試在網絡上的所有位置進行搜索,但似乎無法弄清楚這一重要部分。

基本上,如果我們在檢查用戶是否屬於某個角色時每次都進行一次數據庫調用-這會對性能產生負面影響。

我看到了列出所有用戶角色的代碼示例,例如

var roles = ((ClaimsIdentity)User.Identity).Claims
            .Where(c => c.Type == ClaimTypes.Role)
            .Select(c => c.Value);

該代碼可用於控制器操作,也可以在Attribute Filter中以相同的方式獲取聲明。

從這個示例中,我推斷Claims發揮了作用(似乎是性能最高的解決方案)。

我試圖找出是否 Authorize 使用角色屬性核實用戶的說法 ,但微軟官方文檔不包括該位。

AuthorizeAttribute

指定對控制器或操作方法的訪問僅限於滿足授權要求的用戶。

屬性:

Roles -獲取或設置有權訪問控制器或操作方法的用戶角色。

這就是我們所擁有的范圍。

這兩個Authorize屬性(例如User.IsInRole)都查看User.Identity角色聲明。

默認情況下,授權機構(用戶登錄的地方)將從AspNetUserRoles表中添加角色,作為類型為' http://schemas.microsoft.com/ws/2008/06/identity/claims/role '的聲明。 請參閱WIF聲明類型成員

客戶端應用程序將自動從令牌/ cookie中獲取信息,並將其轉換為User.Identity。 當聲明類型匹配時,角色類型聲明將映射為角色。

這意味着該應用不需要訪問用戶存儲。 在大多數情況下,這也是不可能的。 因此,實際上與性能無關,而與可訪問性有關。 通常,應用程序無權訪問身份上下文。 因此,UserManager不是一個選擇。

然而,在使用權利要求時存在缺點。 該信息已過時。 當用戶登錄時,聲明的快照將被添加到身份中。 同時,如果聲明(或角色)在數據庫中更新,則不會記錄這些更改。 只有在用戶再次登錄后,更改才會生效。

這意味着聲明僅適用於(經常)不會更改的信息,除非您找到使聲明無效的方法。 但這可能意味着要訪問數據庫或調用權限。

這就是為什么我不建議使用角色的原因。 由於角色傾向於用於授權,但與此同時您不能撤消訪問權限。 因此,在解決該問題之前,您可能需要考慮替代方法。

堅持使用UserManager並不是另一種選擇,因為上下文可能不適用於所有應用程序。

因此,基於資源的授權可能是您的解決方案。 在此處閱讀我的答案以獲取其他想法。

打開您的啟動文件並更改此:

services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();

對此:

services.AddIdentity<IdentityUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultUI()
                .AddDefaultTokenProviders();

然后,角色應開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM