Вот код для Startup.cs:
var appSettings = appSettingsSection.Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Auth0MachineToMachineSecret);
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.Events = new JwtBearerEvents
{
OnTokenValidated = (ctx) =>
{
return Task.CompletedTask;
},
OnMessageReceived = (ctx) =>
{
string token = ctx.Request.Headers["Authorization"].ToString().Replace("Bearer ", string.Empty);
IDictionary<string, object> headers = AuthenticationHelper.JwtHeaders(token);
ctx.Token = ctx.Request.Headers["Authorization"].ToString();
// Validate the HS256 Key using a PSK
if (headers.ContainsKey("alg") && headers["alg"].ToString() == "HS256")
{
string secret = appSettings.Auth0MachineToMachineSecret;
string payload = AuthenticationHelper.JwtDecode(token, secret);
ctx.Principal = this.SetTokenInfo(JObject.Parse(payload), appSettings.Auth0AppMeta, ctx);
}
// Validate token with a public RSA key published by the IDP as a list of JSON Web Keys (JWK)
// step 0: you've read the keys from the jwks_uri URL found in http://<IDP authority URL>/.well-known/openid-configuration endpoint
if (headers.ContainsKey("alg") && headers["alg"].ToString() == "RS256")
{
IDPKey iDpKey = AuthenticationHelper.FindIdpKey(headers, "kid", AuthenticationHelper.GetIdpKeys(appSettings.Auth0Tenant));
if (iDpKey == null)
{
return Task.CompletedTask;
}
//If everything is good set the Authorization as true and the CRM user.
JObject payload = AuthenticationHelper.ParsePayload(token);
ctx.Principal = this.SetTokenInfo(payload, appSettings.Auth0AppMeta, ctx);
}
ctx.Token = token;
ctx.Success();
return Task.CompletedTask;
}
};
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
// configure DI for application services
services.AddScoped<IUserService, UserService>();
Мой контроллер всегда возвращает 401 в конечной точке, хотя я знаю, что я предоставляю правильные коды JWT (проверено с помощью jwt.io):
[AllowAnonymous]
[HttpGet("all")]
public IActionResult GetAll()
{
var users = _userService.GetAll();
return Ok(users);
}
Важно знать, что я не провайдер oAuth ... это auth0, но все это в конфигурации, и я использую его только для того, чтобы убедиться, что пользователи имеют право использовать мой вебAPI 2.2 Core Web API конечной точки.
OnMessageReceived запускается, и я устанавливаю свой принципал на нем и отмечаю его как успешный (в противном случае он всегда будет идти к OnAuthenticationFailed), а затем я получаю ответ 401 в Fiddler, даже если код на предъявителя проверенв jwt.io.
Любая помощь с благодарностью.