2017-02-09 4 views
1

Ich bin zu tun JwtBearerAuthentication auf meinem .net WebAPI und es funktioniert einfach nicht. Das Attribut Authorize beansprucht immer isAuthorized = false.welche TokenValidationParameters benötigt werden mit UseJwtBearerAuthentication

Ich arbeite mit Okta als SSO. Ich authentifiziere mich auf meiner Clientseite und erhalte sowohl ein Zugriffstoken als auch ein ID-Token. Auf einer webapi-get-Anfrage stelle ich das Zugriffs-Token (ich habe auch das ID-Token ausprobiert) im authorize-Header zur Verfügung und kann den autorisierten Header mit dem Token im webapi actioncontext sehen.

In meinem startup.cs Ich habe Bin folgende

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") 
    } 
}); 

ich einige TokenValidationParameters fehlt, die ich brauche?

Antwort

1

Mein Problem war nicht mit den Optionen. Es war 100% die Notwendigkeit

app.UseWebApi(config); 

unter allen owin Setup Sachen zu bewegen.

+1

Gut, dass Sie dies herauszufinden konnten! Ich habe unten etwas Code hinzugefügt, nur weil ich Probleme hatte, Zugang zu Ansprüchen zu bekommen und dachte, dass das für Sie hilfreich sein könnte? (Sie sollten dies als "beantwortet" markieren?) –

0

Als ich dies tippte, sah ich, dass Twaldron es herausfinden konnte!

Ich erkannte auch, dass er über WebAPI und nicht MVC fragte. Doch hier ist der Code, den ich brauchte, die folgende Arbeit mit ASP.NET MVC-Core, von besonderem Interesse bekommen könnte diese Linie sein, die notwendig ist, um den Zugang zu den weiteren Ansprüchen im JWT zu erhalten:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

hier ist, wie dieses Codebeispiel aus der Kommandozeile arbeitet, die $ID_TOKEN Variable einen gültigen JWT enthält:

$ 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?}"); 
      }); 
     } 
    } 
} 

In Controller/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

Danke für den Tipp über die Gruppen behauptet. Genau damit kämpfe ich jetzt. Ich bekomme sie nicht. JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); funktionierte nicht für mich tatsächlich Ich hatte nicht diese genaue Methode, ich konnte nur finden InboundClaimTypeMap.Clear(); – twaldron

+1

Ich habe diesen Code mit "Microsoft.AspNetCore.Mvc": "1.0.1" auf "Microsoft.NETCore.App": "1.1.0" arbeiten. Ich musste diese zu meiner project.json Datei hinzufügen, um Sachen zum Funktionieren zu bringen: Microsoft.AspNetCore.Authentication.OAuth, Microsoft.AspNetCore.Authentication.JwtBearer, Microsoft.AspNetCore.Identity - ich kann mich nicht erinnern, welches man JwtSecurityTokenHandler definiert. Lass es mich wissen, wenn du es herausfindest! –

Verwandte Themen