使用Asp.Net Core Identity給用戶添加及刪除角色

    基於Asp.Net Core編制一個項目,須要給用戶添加及刪除角色的功能,因而使用到了Identity中的UserManager。async

    前後解決了幾個問題,終於實現了設想。ide

1. 環境條件測試

    Asp.Net Core 1.0.1spa

    Microsoft.AspNetCore.Identity.EntityFrameworkCore 1.0.0code

2. 給用戶添加角色(組)使用到UserManager.AddToRolesAsync(),元數據中對AddToRolesAsync的解釋爲:orm

        //
        // 摘要:
        //     Add the specified user to the named roles.
        //
        // 參數:
        //   user:
        //     The user to add to the named roles.
        //
        //   roles:
        //     The name of the roles to add the user to.
        //
        // 返回結果:
        //     The System.Threading.Tasks.Task that represents the asynchronous operation, containing
        //     the Microsoft.AspNetCore.Identity.IdentityResult of the operation.
        [AsyncStateMachine(typeof(UserManager<>.<AddToRolesAsync>d__100))]
        public virtual Task<IdentityResult> AddToRolesAsync(TUser user, IEnumerable<string> roles);

    在個人代碼中對應第一個參數的類型是AppcationUser,第二個參數應該是表明角色(組)的字符串列表;blog

    在controller中該行代碼爲:ci

await _userManager.AddToRolesAsync(user, selectedRoles)

   在默認角色表中有兩個關角色名的字段,一個是「Name」,另一個是「NormalizedName」,以下圖所示:字符串

   

    通過嘗試,AddToRolesAsync()中的第二個參數應該是「NormalizedName」。若是使用「Name」會出現錯誤。string

3. 刪除用戶已有角色會使用到UserManager.RemoveFromRoleAsync(),這個方法一樣會使用到AddToRolesAsync()中的兩個參數,使用方法與AddToRolesAsync()相同。

    可是,Identity提供的獲取用戶現有角色的方法只有:userManager.GetRolesAsync(user),其中參數「user」爲<ApplicationUser>。

    這個方法的返回值從元數據中給出的解釋是:role names。通過測試實際爲「Name」字段。

        //
        // 摘要:
        //     Gets a list of role names the specified user belongs to.
        //
        // 參數:
        //   user:
        //     The user whose role names to retrieve.
        //
        // 返回結果:
        //     The System.Threading.Tasks.Task that represents the asynchronous operation, containing
        //     a list of role names.
        [AsyncStateMachine(typeof(UserManager<>.<GetRolesAsync>d__105))]
        public virtual Task<IList<string>> GetRolesAsync(TUser user);

    這樣,就出現了不太方便的問題,刪除用戶角色方法RemoveFromRoleAsync(),須要使用「NormalizedName」,而identity獲取的當前用戶現有角色只能使用GetRolesAsync(),該方法得到的是角色的「Name」。

    因此想固然的代碼(以下)不會出現編譯錯誤,一樣也不會出現運行錯誤,但實際運行後,應該被刪除的角色實際上刪除不了:

var nowRoles = _userManager.GetRolesAsync(user).Result; //獲得的nowRoles是角色的Name await _userManager.RemoveFromRolesAsync(user, nowRoles); //這裏須要的是角色的NormalizedName

    因此,只能想辦法獲得當前用戶角色的「NormalizedName」,再傳遞給RemoveFromRoleAsync()。

    這面這個辦法比較繁瑣,但想不到更簡單的辦法。

var normalizedName = allRoles.Where(r => r.Name == nowRole).First().NormalizedName;

    其中:allRoles是這樣獲得的

var allRoles = _roleManager.Roles;

    整個代碼是這樣的:

                var allRoles = _roleManager.Roles; //系統中全部的角色
                var nowRoles = _userManager.GetRolesAsync(user).Result; //該用戶現有的角色「Name」
                foreach (var nowRole in nowRoles)
                {
                    var normalizedName = allRoles.Where(r => r.Name == nowRole).First().NormalizedName;//取得現有角色的NormalizedName
                    await _userManager.RemoveFromRoleAsync(user, normalizedName); //刪除不要的角色
                }
                await _userManager.AddToRolesAsync(user, selectedRoles); //添加須要的角色
                await _userManager.UpdateAsync(user); //完成儲存

上面代碼沒有進行鍼對性的添加,代碼有些繁雜,不過這樣也不會出現錯誤,省事兒。

至此,結束。

記錄,備查。

相關文章
相關標籤/搜索