2017-11-09 25 views
1

私のアプリケーションでCookie認証を使用してトークン認証を設定しようとしています。トークンとCookie認証でIDを使用する

私はasp.netコア2.0で、認証する個々のユーザーアカウントを持つMVCプロジェクトを作成しました。ユーザーに役割を設定する。

私はショーンWildermuthのこのチュートリアルに従うならばTwo-AuthorizationSchemes-in-ASP-NET-Core-2

すべては登録ユーザーのトークンを取得するために、正常に動作します。しかし、私がAuthorize [Authorize(Roles = "Admin")]にRole属性を使用すると、403レスポンスが返ってきます。

トークンが認証で役割を受け取っていないためだと思います。

これを設定するにはどうすればよいですか?トークンプロセスでロールを渡す方法はありますか?

トークンを生成するために、彼は、コードのこの部分を使用している:

[AllowAnonymous] 
[HttpPost] 
public async Task<IActionResult> GenerateToken([FromBody] LoginViewModel model) { if (ModelState.IsValid) { 
     var user = await _userManager.FindByEmailAsync(model.Email); 

     if (user != null) 
     { 
      var result = await _signInManager.CheckPasswordSignInAsync(user, model.Password, false); 
      if (result.Succeeded) 
      { 

      var claims = new[] 
      { 
       new Claim(JwtRegisteredClaimNames.Sub, user.Email), 
       new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), 
      }; 

      var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"])); 
      var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 

      var token = new JwtSecurityToken(_config["Tokens:Issuer"], 
       _config["Tokens:Issuer"], 
       claims, 
       expires: DateTime.Now.AddMinutes(30), 
       signingCredentials: creds); 

      return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) }); 
      } 
     } } 

     return BadRequest("Could not create token"); } 

君たちがどんな考えを持っていますか?

ありがとうございました

答えて

1

次のコードとusingを追加すると役立ちます。

using System.Security.Claims; 

...

var userRoles = await _userManager.GetRolesAsync(user); 

    var claims = new[] 
     { 
      new Claim(JwtRegisteredClaimNames.Sub, user.Email), 
      new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), 
     }.Union(userRoles.Select(m => new Claim(ClaimTypes.Role, m))); 

あなたはClaimTypes.Roleのタイプの中での役割を追加すること連合を見ることができ、これは

HTH AuthorizeAttributeで使用することを可能にします

+0

こんにちは、それは動作しません.... thayユーザーには役割の定義がありません... Thanks –

+0

申し訳ありませんが、私は、user.Rolesをあなたのユーザーのための役割をどのように取得するのか独自の実装で置き換える必要があることは明らかでした。コードに手動で役割を追加して、PoCを好きな人にはうまく動作するかどうかを確認することができます – Slicksim

+1

こんにちは...私はこれをやっています: generateTokenメソッドでは、まずユーザーロールを取得します: var userRoles = await _userManager.GetRolesAsync(user); (ClaimTypes.Role、userRoles.FirstOrDefault()) 申し立てにロールを追加するには、次のように入力します。 しかし、問題は、ユーザーが複数の役割を持つ場合、最初のものだけを取得することです。 :-( –

関連する問題