Ich war auf einem ziemlichen Abenteuer, um JWT an DotNet Core 2.0 zum Laufen zu bringen (das heute die endgültige Version erreicht). Es gibt eine Menge Dokumentation, aber der gesamte Beispielcode scheint veraltete APIs zu verwenden und kommt neu in Core. Es ist schwindelerregend herauszufinden, wie genau er implementiert werden soll. Ich habe versucht, Jose zu verwenden, aber App. UseJwtBearerAuthentication ist veraltet und es gibt keine Dokumentation darüber, was als nächstes zu tun ist.
Hat jemand ein Open Source-Projekt, das Dotnet Core 2.0 verwendet, das einfach eine JWT aus dem Autorisierungsheader analysieren und mir erlauben kann, Anforderungen für ein HS256-codiertes JWT-Token zu autorisieren?
Die folgende Klasse wirft keine Ausnahmen aus, aber es sind keine Anfragen autorisiert, und ich erhalte keinen Hinweis darauf, warum sie nicht autorisiert sind. Die Antworten sind leere 401, was für mich bedeutet, dass es keine Ausnahme gab, aber dass das Geheimnis nicht übereinstimmt.
Eine seltsame Sache ist, dass meine Token mit dem HS256-Algorithmus verschlüsselt sind, aber ich sehe keinen Indikator, der ihn anweist, ihn zu zwingen, diesen Algorithmus irgendwo zu verwenden.
Hier ist die Klasse, die ich bisher habe:
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;
}
}
}