2016-07-15 17 views
1

OWINトークンベースの認証でWeb API 2を使用しています。ロールに基づく権限を除いて、すべてうまくいっています。私は役割管理を持つユーザーと自分のアプリケーションにログインしますが、私は、不正なエラー401が登録しようとしたときに取得する:認証エラー - トークンベースの承認とロールを持つASP.NET Web API

[Authorize(Roles = "Admin")] 
[RoutePrefix("api/Account")] 
public class AccountController : ApiController 
{ 
    .............. 

    // POST api/Account/Register 
    //[AllowAnonymous] 
    [Route("Register")] 
    public async Task<IHttpActionResult> Register(AppUser user) 
    { 
     ............... 

問題は以下の通りです:

は、ここに私のコントローラです。私はすでに、AspNetUserRolesテーブルの管理者でログインするために使用しているAspNetUserを修正しました。ここで

は私のGrantResourceOwnerCredentials方法である:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 

     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 

     using (AuthRepository _repo = new AuthRepository(new GloboStudioUniversityContext())) 
     { 
      IdentityUser user = await _repo.FindUser(context.UserName, context.Password); 

      if (user == null) 
      { 
       context.SetError("invalid_grant", "The user name or password is incorrect."); 
       return; 
      } 


     } 

     var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
     identity.AddClaim(new Claim("sub", context.UserName)); 
     //identity.AddClaim(new Claim("role", "user")); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "Admin")); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "Student")); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "Candidate")); 

     context.Validated(identity); 

    } 
+0

デバッグの目的でAuthorize属性を削除し、次にメソッド 'User.IsInRole(" Admin ")を呼び出して、すべてのクレームを繰り返して、ユーザーが実際にAdminグループの一部であるかどうかを調べることができます。 – Michael

+0

私はすでにデバッグしていて、ユーザーが管理者グループに属していないことをIsInRoleが示しています。何が間違っているか不足していますか? –

答えて

0

あなたは...「管理者」クレームはお使いのAPIメソッドで解決されたかどうかを確認するために

var identity = User.Identity as ClaimsIdentity; 
var claim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Role && c.Value == "Admin"); 

if (claim == null) { 
    //Raise 401 
} 

を確認することができます承認属性は理解していませんクレームこれはAdminとしてロールを探すため、IPrincipalインターフェイスの "User.IsInRole"メソッドを呼び出します。

この作業を行うには、owinパイプラインの役割としてクレームを追加し、HttpContext.Current.Userに割り当てる必要があります。

関連する問題