2017-12-23 6 views
1

Ich versuche, JSON Web Token basierte Authentifizierung in meiner api Anwendung anwenden. Das Problem ist, dass ich jedes Mal, wenn ich meinen Token teste, eine ungültige Tokensignatur erhalte. Außerdem kann ich meine Anfrage bei meinen Controllern nicht autorisieren lassen und ich denke, dass es etwas mit der Generierung der letzteren zu tun haben könnte.Wie konfiguriert man JWT in asp.net Core2 richtig?

Ich poste alle relevanten Code und würde sehr schätzen, wenn mir jemand helfen kann. Der Quellcode wird von github abgeleitet ASPNETCore2JwtAuthentication

appsettings.json

"BearerTokens": { 
    "Key": "iNivDmHLpUA223sqsfhqGbMRdRj1PVkH", 
    "Issuer": "http://localhost/", 
    "Audience": "http://localhost/", 
    "AccessTokenExpirationMinutes": 2, 
    "RefreshTokenExpirationMinutes": 60 
}, 

Startup.cs/ConfigureServices

  services.AddAuthorization(options => 
        { 
         options.AddPolicy(CustomRoles.Admin, policy => policy.RequireRole(CustomRoles.Admin)); 
         options.AddPolicy(CustomRoles.User, policy => policy.RequireRole(CustomRoles.User)); 
         options.AddPolicy(CustomRoles.Editor, policy => policy.RequireRole(CustomRoles.Editor)); 
        }); 


      services.AddAuthentication(options => 
       { 
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
        options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; 
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
       }) 
       .AddCookie(cfg => 
       { 
        cfg.SlidingExpiration = true; 
       }) 
       .AddJwtBearer(cfg => 
       { 
        cfg.RequireHttpsMetadata = false; 
        cfg.SaveToken = true; 
        cfg.TokenValidationParameters = new TokenValidationParameters 
        { 
         ValidIssuer = Configuration["BearerTokens:Issuer"], 
         ValidAudience = Configuration["BearerTokens:Audience"], 
         IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["BearerTokens:Key"])), 
         ValidateIssuerSigningKey = true, 
         ValidateLifetime = true, 
         ClockSkew = TimeSpan.Zero 
        }; 
        cfg.Events = new JwtBearerEvents 
        { 
         OnAuthenticationFailed = context => 
         { 
          var logger = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>().CreateLogger(nameof(JwtBearerEvents)); 
          logger.LogError("Authentication failed.", context.Exception); 
          return Task.CompletedTask; 
         }, 
         OnTokenValidated = context => 
         { 
          var tokenValidatorService = context.HttpContext.RequestServices.GetRequiredService<ITokenValidatorService>(); 
          return tokenValidatorService.ValidateAsync(context); 
         }, 
         OnMessageReceived = context => 
         { 
          return Task.CompletedTask; 
         }, 
         OnChallenge = context => 
         { 
          var logger = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>().CreateLogger(nameof(JwtBearerEvents)); 
          logger.LogError("OnChallenge error", context.Error, context.ErrorDescription); 
          return Task.CompletedTask; 
         } 
        }; 
       }); 


      services.AddCors(options => 
      { 
       options.AddPolicy("CorsPolicy", 
        builder => builder 
         .WithOrigins("http://localhost:4200") //Note: The URL must be specified without a trailing slash (/). 
         .AllowAnyMethod() 
         .AllowAnyHeader() 
         .AllowCredentials()); 
      }); 
      services.AddMvc(); 



**Startup.cs**/Configure 


app.UseAuthentication(); 
app.UseMvc(); 

TokenStoreService.cs

Probe der generierten Token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkODFhNTQ4ZS0xOWFlLTRhNDQtODZhMS0zY2ZiNWU0MmE4ZDkiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0LyIsImlhdCI6MTUxNDAwODYwOCwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiIwYjk0NWZkZC00ZjViLTRhMmEtODNiZi0yNTA1YjBkNjJiODUiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiSlNPTiIsIkRpc3BsYXlOYW1lIjoiQWJ1IE1haXphciIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvc2VyaWFsbnVtYmVyIjoiNTU0Zjg5ZjMtZjRiMi00ODY0LThiMzctZWNmMGY2OGNlOWM0IiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy91c2VyZGF0YSI6IjBiOTQ1Zm RkLTRmNWItNGEyYS04M2JmLTI1MDViMGQ2MmI4NSIsIm5iZiI6MTUxNDAwODYwNywiZXhwIjoxNTE0MDA4NzI3LCJhdWQiOiJodHRwOi8vbG9jYWxob3N0LyJ9.q-IphSwiOhzDT9upOO4XOvGQVp_NxymcuW4WWuERe2U

validation link

+0

Ich habe einen Schritt für Schritt Blogpost schreiben, kann es Ihnen helfen https://mostafizz.wordpress.com/2017/09/30/jwt-token-with-cookie-authentication-in-asp-net-core -2-0/ – Mostafiz

+0

Das gleiche Problem, Ihr Code für Cookies aber nicht JWT – JSON

+0

Ich hoffe, Sie haben Schlüssel zur Verfügung gestellt, wenn Sie versucht, JWT zu validieren. Ich sehe kein Problem mit JWT als solches. Der von Ihnen bereitgestellte JWT-Validierungslink zeigt Ihnen immer die ungültige Signatur an, bis Sie den Schlüssel angeben, den Sie zum Generieren von JWT verwendet haben –

Antwort

0

so war mein Problem um einen Fehler in meinem ITokenValidatorService das ist Ihre individuelle Art und Weise Ihre eigenen Zeichen zu validieren.

OnTokenValidated = context => 
         { 
          var tokenValidatorService = context.HttpContext.RequestServices.GetRequiredService<ITokenValidatorService>(); 
          return tokenValidatorService.ValidateAsync(context); 
         }, 

Die Konfigurations oben zeigte arbeitet

ganz gut, aber ich frage mich immer noch, warum JWT validator hält Token als ungültig jeder eingereicht Rückkehr!

Verwandte Themen