2017-03-02 18 views
0

私はユーザーを作成し、彼に多数の主張を持つ役割を付けました。問題は、Entity FrameworkのコアとIDの統合を使用してアクセスするための直接的な方法がないことです。私が理想的にやってみたいことは次のとおりです:役割クレームを取得するには?

return _context.Users 
    .Include(u => u.Roles) 
    .ThenInclude(r => r.Role) 
    .ThenInclude(r => r.Claims) 

しかし、ロールのプロパティはRoleIdではありません。だから私は役割の主張を含めることはできません。もちろん、私はクレームを得るために、またはRoleManagerを使用するために別のクエリを作成します:

var user = _context.Users.Single(x => x.Id == ...); 
var role = _roleManager.Roles.Single(x => x.Id == user.Roles.ElementAt(0).RoleId); 
var claims = _roleManager.GetClaimsAsync(role).Result; 

しかし、それは非効率的で醜いです。 1つのクエリを作成する方法があるはずです。

私の最後の希望はController.Userプロパティ(ClaimsIdentity)でした。どういうわけか、すべての役割からクレームをスマートに集約したいと思っていました。しかし、それは...

+0

Controller.Userが動作するはずです:次に、あなただけのこのような何かを呼び出すことができます。それは私が現在ログインしているセッションを確認するために使用するものです。ログインしたセッションを確認していますか、他のユーザーを参照しようとしていますか? –

+0

私はログインしたユーザーのためにそれを取得しようとしています。私はそれがうまくいくはずだと思ったが、そうではないようだ。それはUser.Claimsだけを得るように思えます。 – SiberianGuy

+0

@Mike_G、理由は私がIdentityServerを使用していると思われ、デフォルトで役割クレームを処理しません。他の認証方法を使用した場合、デフォルトで役割要求を取得します。 – SiberianGuy

答えて

1

あなたはSQLに似たクエリ式を使用することができず、このようなユーザーのすべてのロールからのすべての請求を受けるように思える:

var claims = from ur in _context.UserRoles 
      where ur.UserId == "user_id" 
      join r in _context.Roles on ur.RoleId equals r.Id 
      join rc in _context.RoleClaims on r.Id equals rc.RoleId 
      select rc; 
0
  1. はあなたが追加されていることを確認役割と主張を正しく理解する。以下は、ユーザーを作成し、クレームとロールを追加する方法の例です。

    private async Task<IdentityResult> CreateNewUser(ApplicationUser user, string password = null){ 
    
        //_roleManger is of type RoleManager<IdentityRole> 
        // _userManger is of type UserManager<ApplicationUser> 
        //and both are injected in to the controller. 
    
        if (!await _roleManger.RoleExistsAsync("SomeRole")){ 
         await _roleManger.CreateAsync(new IdentityRole("SomeRole")); 
        } 
    
        var result = password != null ? await _userManager.CreateAsync(user, password) : await _userManager.CreateAsync(user); 
    
        if(result.Succeeded) { 
    
         await _userManager.AddToRoleAsync(user, "SomeRole"); 
         await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Name, user.Email)); 
    
        } 
    
        return result; 
    } 
    
  2. 次に、あなたは、特許請求の範囲を取得するために_userManagerを使用することができます。 This is how_userManagerを使用して現在のユーザーを取得します。

    var claims = await _userManager.GetClaimsAsync(user); 
    
+0

これは、ロールではなくユーザーにクレームを追加します。 – LHolleman

+0

@LHolleman "_userManager.AddToRoleAsync"と "CreateRole"の行全体を見逃しましたか?あなたは答えを一読しましたか? –