Byłem na niezłej przygodzie, aby JWT działał na DotNet core 2.0 (teraz osiągam ostateczne wydanie dzisiaj). Jest mnóstwo dokumentacji, ale wydaje się, że cały przykładowy kod korzysta z przestarzałych interfejsów API i pojawia się na nowo w Core. To naprawdę oszałamiające, gdy zastanawiasz się, jak dokładnie ma zostać wdrożony. Próbowałem użyć Jose, ale aplikacja. UseJwtBearerAuthentication zostało uznane za przestarzałe i nie ma dokumentacji na temat dalszych działań.
Czy ktoś ma projekt typu open source, który używa dotnet core 2.0, który może po prostu przeanalizować JWT z nagłówka autoryzacji i pozwolić mi na autoryzowanie żądań tokenu JWT zakodowanego HS256?
Poniższa klasa nie zgłasza żadnych wyjątków, ale żadne żądania nie są autoryzowane i nie mam żadnych wskazówek, dlaczego są nieautoryzowane. Odpowiedzi są puste 401, więc dla mnie oznacza to, że nie było wyjątku, ale sekret nie pasuje.
Dziwną rzeczą jest to, że moje tokeny są szyfrowane algorytmem HS256, ale nie widzę wskaźnika, który kazałby mu zmusić go do użycia tego algorytmu w dowolnym miejscu.
Oto klasa, którą mam do tej pory:
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
using Newtonsoft.Json.Linq;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace Site.Authorization
{
public static class SiteAuthorizationExtensions
{
public static IServiceCollection AddSiteAuthorization(this IServiceCollection services)
{
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("SECRET_KEY"));
var tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
IssuerSigningKeys = new List<SecurityKey>{ signingKey },
// Validate the token expiry
ValidateLifetime = true,
};
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
o.IncludeErrorDetails = true;
o.TokenValidationParameters = tokenValidationParameters;
o.Events = new JwtBearerEvents()
{
OnAuthenticationFailed = c =>
{
c.NoResult();
c.Response.StatusCode = 401;
c.Response.ContentType = "text/plain";
return c.Response.WriteAsync(c.Exception.ToString());
}
};
});
return services;
}
}
}