Tôi đã trải qua một cuộc phiêu lưu khá thú vị để JWT hoạt động trên DotNet core 2.0 (hiện đã có bản phát hành cuối cùng ngày hôm nay). Có một tấn tài liệu, nhưng tất cả các mẫu mã có vẻ là sử dụng API phản đối và sắp tới trong tươi Core, Nó tích cực chóng mặt để tìm ra cách chính xác nó là nghĩa vụ phải được thực hiện. Tôi đã thử sử dụng Jose, nhưng ứng dụng. UseJwtBearerAuthentication đã không còn được dùng nữa và không có tài liệu nào về việc cần làm tiếp theo.
Có ai có dự án nguồn mở sử dụng dotnet core 2.0 có thể chỉ cần phân tích cú pháp JWT từ tiêu đề ủy quyền và cho phép tôi ủy quyền yêu cầu mã thông báo JWT được mã hóa HS256 không?
Lớp bên dưới không đưa ra bất kỳ ngoại lệ nào, nhưng không có yêu cầu nào được cho phép và tôi không nhận được dấu hiệu tại sao chúng không được phép. Các câu trả lời trống 401, vì vậy đối với tôi điều đó cho thấy không có ngoại lệ, nhưng bí mật không khớp.
Một điều kỳ lạ là các mã thông báo của tôi được mã hóa bằng thuật toán HS256, nhưng tôi không thấy chỉ báo nào cho biết buộc nó phải sử dụng thuật toán đó ở bất kỳ đâu.
Đây là lớp tôi có cho đến nay:
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;
}
}
}