2017-03-25 20 views
4

IdentityServer3トークンプロバイダによって発行されたトークンを使用するWebAPI 2プロジェクトがあります。私のStartup.csファイルでは、IdentityServerBearerTokenAuthorizationミドルウェアが実装されており、グローバルAuthorizateAttributeフィルタとともに、有効なトークンが要求に存在することを要求しています。しかし、ClaimsTransformationを追加して、暗黙のフローを使用して発行されたトークンまたはクライアントの資格フローのために発行されたトークンのいずれかで、クレームから「ロール」を抽出できます。スコープを使用することはできません。なぜなら、1つのスコープでAPIを使用できるようになっていますが、すべてのクライアントがすべてのAPIエンドポイントを使用することができないからです。私APIController操作でIdentityServer3ベアラトークンでWebAPI認可属性が呼び出されない

Startup.cs

JwtSecurityTokenHandler.InboundClaimTypeMap.Clear(); 


     app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions() 
     { 
      Authority = ConfigurationManager.AppSettings["IdentityServer"], 
      RequiredScopes = new[] { "my.api" }, 
     }); 



     httpConfig.MapHttpAttributeRoutes(); 
     httpConfig.Filters.Add(new AuthorizeAttribute()); 


     //SwaggerConfig.Register(httpConfig); 

     app.UseAutofacMiddleware(container); 
     app.UseAutofacWebApi(httpConfig); 
     app.UseWebApi(httpConfig); 

     app.UseClaimsTransformation(identity => 
     { 
      var principal = new ClaimsPrincipal(identity); 
      if (!identity.HasClaim(c => c.Type == "name") && identity.HasClaim(c => c.Type == "client_name")) 
      { 
       identity.Identities.First().AddClaim(new Claim("name", identity.Claims.First(c => c.Type == "client_name").Value)); 
      } 

      //we want to remove the client_ from the claims so we can evaluate clients like they are users 
      if (identity.Claims.Any(c => c.Type.Contains("client_"))) 
      { 
       foreach (var claim in identity.Claims.Where(c => c.Type.Contains("client_"))) 
       { 
        var newClaimType = claim.Type.Replace("client_", ""); 
        identity.Identities.First().AddClaim(new Claim(newClaimType, claim.Value)); 
       } 
      } 

      //set the scopes as roles also 
      if (identity.Claims.Any(c => c.Type == "scope")) 
      { 
       identity.Identities.First().AddClaims(identity.Claims.Where(c => c.Type == "scope").Select(c => new Claim("role", c.Value))); 
      } 

      return Task.FromResult(principal); 
     }); 

、私は定義された役割のプロパティと承認の属性を持っています。グローバルなAuthorize属性は機能していますが、役割のチェックは行われません。何か不足していますか? \ APIコントローラ

[HttpDelete] 
    [Authorize(Roles = "item.deleter")] 
    [Route("{itemId:guid}")] 
    public async Task<HttpResponseMessage> DeleteAsync([ValidGuid] Guid itemId) 
    { 
     _log.Audit.Info($"Received Delete request for item {itemId} from user {User.Identity?.Name}."); 
     if (!ModelState.IsValid) 
     .... 

答えて

2

あなたの主張は、火災を変換する前に、あなたのauthroize属性が最も可能性の高い発射されます。

あなたのowinパイプラインでは、クレーム変換の前にwebAPIを追加しました。あなたの要求がパイプラインに沿って移動するにつれて、Web APIはクレーム変換がそのビットを行うことができる前に、それに対する許可を実行するように要求します。&

は、私がクレーム変換を動かすが、私はまだ問題を抱えています試してみましたUseWebApi

+0

UseClaimsTransformationを移動してみてください。実際、何が起きているのかを知るために独自の属性を作成しましたが、どちらも当てはまりません(Authorizeから継承していますので、次の試みはASP.NET Identityワークフローから完全に抜け出すことを継承しません) 。グローバルなauthorize属性を持ち、それをメソッドからオーバーライドすることに関する既知の問題はありますか?私の理解は、それがAND型操作として扱われるということです。 – Mike

関連する問題