web-dev-qa-db-ja.com

asp.net IDは、ログインしているユーザーのすべてのロールを取得します

this チュートリアルに従った役割ベースのメニューを作成しました。そのページのどこかに、次のコード行が表示されます。

String[] roles = Roles.GetRolesForUser();

現在ログインしているユーザーのすべてのロールを返します。新しいASP.NET Identityシステムでこれを達成する方法を知りたいのですが?

それはまだかなり新しく、それについて見つけることはあまりありません。

53
Quoter

Controller.User.IdentityClaimsIdentityです。クレームを調べると、ロールのリストを取得できます...

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

---更新---

もう少し詳しく...

using System.Security.Claims;

// ........

var userIdentity = (ClaimsIdentity)User.Identity;
var claims = userIdentity.Claims;
var roleClaimType = userIdentity.RoleClaimType;
var roles = claims.Where(c => c.Type == ClaimTypes.Role).ToList();

// or...
var roles = claims.Where(c => c.Type == roleClaimType).ToList();
101
Anthony Chu

上記のソリューションの拡張方法を次に示します。

    public static List<string> Roles(this ClaimsIdentity identity)
    {
        return identity.Claims
                       .Where(c => c.Type == ClaimTypes.Role)
                       .Select(c => c.Value)
                       .ToList();
    }
17
LawMan

System.IdentityModel.Claims名前空間を使用する代わりに@usingを使用しないでください。

@using System.Security.Claims

    @using System.Security.Claims
    @using Microsoft.AspNet.Identity
    @{      
       var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
       var customUserClaim = claimsIdentity != null ? claimsIdentity.Claims.FirstOrDefault(x => x.Type == "cutomType") : null;
       var customTypeValue= customUserClaim != null ? customUserClaim .Value : User.Identity.GetUserName();
       var roleOfUser = claimsIdentity != null ? claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value :"User";

}
2
Abdul Rahim

サインインマネージャーからIDユーザーを取得した後、UserManagerでGetRolesAsyncを呼び出し、パラメーターとしてIDユーザーを渡します。登録されているIDユーザーのロールのリストが返されます。

var rolesList = await userManager.GetRolesAsync(identityuser).ConfigureAwait(false);
1
Mak Ahmed