using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Localization; using PrivaPub.ClientModels; using PrivaPub.Resources; using System.Text; using System.Text.Json; namespace PrivaPub.Services { public class JwtEvents : JwtBearerEvents { ILogger _logger { get; set; } const string contentType = "application/json"; public override async Task Challenge(JwtBearerChallengeContext context) { context.HandleResponse(); context.Response.StatusCode = StatusCodes.Status401Unauthorized; context.Response.Headers.WWWAuthenticate = context.AuthenticateFailure == default ? "Bearer" : "Bearer error=\"invalid_token\""; try { var localizer = context.HttpContext.RequestServices.GetRequiredService>(); var webResult = new WebResult().Invalidate(localizer["Unauthorized."], StatusCodes.Status401Unauthorized); context.Response.ContentType = contentType; await context.Response.BodyWriter.WriteAsync(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(webResult))); } catch (Exception ex) { _logger = context.HttpContext.RequestServices.GetRequiredService>(); _logger.LogError(ex, "Error at Challenge()"); } } public override async Task Forbidden(ForbiddenContext context) { try { var localizer = context.HttpContext.RequestServices.GetRequiredService>(); var webResult = new WebResult().Invalidate(localizer["Forbidden."], StatusCodes.Status403Forbidden); context.Response.ContentType = contentType; await context.Response.BodyWriter.WriteAsync(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(webResult))); } catch (Exception ex) { _logger = context.HttpContext.RequestServices.GetRequiredService>(); _logger.LogError(ex, "Error at Forbidden()"); } } } }