2017-02-09 5 views
1

私はWebAPIJwtBearerAuthenticationをやりたいと思っています。 Authorize属性は、常にisAuthorized = falseを要求します。TokenValidationParametersがUseJwtBearerAuthenticationと一緒に必要です

私はSSOとしてOktaを使用しています。私はクライアント側で認証し、アクセストークンとIDトークンの両方を取得しています。 webapiのリクエストでは、私はアクセストークン(私はidトークンも試しました)をauthorizeヘッダーに提供しています。私はwebapi actioncontextのトークンを使ってauthorizeヘッダーを見ることができます。私は

var clientID = WebConfigurationManager.AppSettings["okta:ClientId"]; 

var oidcIssuer = WebConfigurationManager.AppSettings["okta:OIDC_Issuer"]; 

TokenValidationParameters tvps = new TokenValidationParameters 
{ 
    ValidAudience = clientID, 
    ValidateAudience = true, 
    ValidIssuer = oidcIssuer, 
    ValidateIssuer = true 
}; 

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions 
{ 
    TokenValidationParameters = tvps, 
    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
    { 
     new OpenIdConnectCachingSecurityTokenProvider(oidcIssuer + "/.well-known/openid-configuration") 
    } 
}); 

を以下している私のstartup.csで

は私が必要とするいくつかのTokenValidationParameters足りませんか?

答えて

1

私の問題はオプションではありませんでした。 それは100%は、全てのowinセットアップのものの下に

app.UseWebApi(config); 

を移動する必要がありました。

+1

うれしいです!私は、以下のコードを追加しました。なぜなら、主張にアクセスすることに問題があって、それがあなたに役立つかもしれないと思ったからです。 (あなたはこれを「回答しました」と記す必要があります) –

0

私はこれをタイプしていたので、twaldronがそれを理解することができたことがわかります!

また、彼はMVCではなくWebAPIについて質問していることに気付きました。しかし、ここで私はASP.NET MVCのコアで作業を次のように取得するために必要なコードがあり、特に関心のJWTに追加の主張へのアクセスを取得する必要があり、このライン、次のようになります。

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

ここでは、このコードサンプルは、コマンドラインからどのように動作するかで、$ID_TOKEN変数が有効なJWTが含まれています

$ curl -H "Authorization: Bearer ${ID_TOKEN}" http://localhost:3000/test/test 
sub: 01a23b4cd5eFgHI6j7k8 email:[email protected] 

Setup.cs

using System; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using Microsoft.IdentityModel.Tokens; 
using System.IdentityModel.Tokens.Jwt; 

namespace WebApplication 
{ 
    public class Startup 
    { 
     readonly string clientId = string.Empty; 
     readonly string issuer = string.Empty; 
     readonly string audience = string.Empty; 

     public Startup(IHostingEnvironment env) 
     { 
      clientId = "A0b1CDef2GHIj3k4lm5n"; 
      issuer = "https://example.okta.com"; 
      audience = "A0b1CDef2GHIj3k4lm5n"; 
     } 

     public IConfigurationRoot Configuration { get; } 

     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMvc(); 
     } 

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddDebug(); 

      // https://github.com/aspnet/Security/issues/1043#issuecomment-261937401 
      JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

      TokenValidationParameters tvps = new TokenValidationParameters 
      { 

       ValidateAudience = true, 
       ValidAudience = audience, 

       ValidateIssuer = true, 
       ValidIssuer = issuer, 

       ValidateLifetime = true, 
       ClockSkew = TimeSpan.FromMinutes(5) 
      }; 

      app.UseJwtBearerAuthentication(new JwtBearerOptions 
      { 
       MetadataAddress = issuer + "/.well-known/openid-configuration", 
       TokenValidationParameters = tvps 
      }); 


      app.UseStaticFiles(); 

      // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715 

      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "test-controller", 
        template: "test/{action}", 
        defaults: new { controller = "Test", action = "Index" } 
       ); 
       routes.MapRoute(
        name: "default", 
        template: "{controller=Test}/{action=Index}/{id?}"); 
      }); 
     } 
    } 
} 

コントローラ/ Test.cs:あなたがこれを理解することができました

[Authorize] 
    public IActionResult Test() 
    { 
     var contextUser = User.Identity as ClaimsIdentity; 
     Dictionary<string, string> claim = contextUser.Claims.ToDictionary(x => x.Type, x => x.Value); 

     var output = "sub: " + claim["sub"] + " email:" + claim["email"]; 
     return Content(output); 
    } 
+0

グループの主張についてのヒントをありがとう。これは実際に私が現在苦労していることです。私はそれらを取得していません。 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();実際に私はその正確なメソッドを持っていませんでした、私はInboundClaimTypeMap.Clear()を見つけることができました。 – twaldron

+1

私はこのコードを "Microsoft.AspNetCore.Mvc"を使って動作させました: "1.0.1" on "Microsoft.NETCore.App": "1.1.0"。 Microsoft.AspNetCore.Authentication.OAuth、Microsoft.AspNetCore.Authentication.JwtBearer、Microsoft.AspNetCore.Identity - JwtSecurityTokenHandlerを定義するものは覚えていません。あなたが見つけたら教えてください! –

関連する問題