fix: fix bug 404 in jwt config

This commit is contained in:
Meysam Hadeli 2025-04-11 18:21:23 +03:30
parent d705ff12f2
commit 5e2c92fda6
29 changed files with 68 additions and 36 deletions

View File

@ -11,6 +11,7 @@ using BuildingBlocks.Core.Event;
using BuildingBlocks.Core.Model;
using BuildingBlocks.EventStoreDB.Repository;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -51,7 +52,7 @@ public class CreateBookingEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateBooking")
.WithApiVersionSet(builder.NewApiVersionSet("Booking").Build())
.Produces<CreateBookingResponseDto>()

View File

@ -6,6 +6,7 @@ using BookingMonolith.Flight.Data;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -49,7 +50,7 @@ public class CreateAircraftEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateAircraft")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateAircraftResponseDto>()

View File

@ -5,6 +5,7 @@ using BookingMonolith.Flight.Data;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -47,7 +48,7 @@ public class CreateAirportEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateAirport")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateAirportResponseDto>()

View File

@ -7,6 +7,7 @@ using BookingMonolith.Flight.Flights.ValueObjects;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -55,7 +56,7 @@ public class CreateFlightEndpoint : IMinimalEndpoint
return Results.CreatedAtRoute("GetFlightById", new { id = result.Id }, response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateFlight")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateFlightResponseDto>(StatusCodes.Status201Created)

View File

@ -4,6 +4,7 @@ using BookingMonolith.Flight.Flights.Exceptions;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using MediatR;
using Microsoft.AspNetCore.Builder;
@ -44,7 +45,7 @@ public class DeleteFlightEndpoint : IMinimalEndpoint
return Results.NoContent();
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("DeleteFlight")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces(StatusCodes.Status204NoContent)

View File

@ -5,6 +5,7 @@ using BookingMonolith.Flight.Flights.Exceptions;
using BuildingBlocks.Caching;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using Mapster;
using MapsterMapper;
using MediatR;
@ -39,7 +40,7 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetAvailableFlights")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<GetAvailableFlightsResponseDto>()

View File

@ -4,6 +4,7 @@ using BookingMonolith.Flight.Flights.Dtos;
using BookingMonolith.Flight.Flights.Exceptions;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -35,7 +36,7 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetFlightById")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<GetFlightByIdResponseDto>()

View File

@ -9,6 +9,7 @@ using BuildingBlocks.Caching;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using MapsterMapper;
using MediatR;
@ -52,7 +53,7 @@ public class UpdateFlightEndpoint : IMinimalEndpoint
return Results.NoContent();
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("UpdateFlight")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces(StatusCodes.Status204NoContent)

View File

@ -7,6 +7,7 @@ using BookingMonolith.Flight.Seats.ValueObjects;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -40,7 +41,7 @@ public class CreateSeatEndpoint : IMinimalEndpoint
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{
builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/seat", CreateSeat)
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateSeat")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateSeatResponseDto>()

View File

@ -4,6 +4,7 @@ using BookingMonolith.Flight.Seats.Dtos;
using BookingMonolith.Flight.Seats.Exceptions;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -27,7 +28,7 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{
builder.MapGet($"{EndpointConfig.BaseApiPath}/flight/get-available-seats/{{id}}", GetAvailableSeats)
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetAvailableSeats")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<GetAvailableSeatsResponseDto>()

View File

@ -4,6 +4,7 @@ using BookingMonolith.Flight.Seats.Exceptions;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -31,7 +32,7 @@ public class ReserveSeatEndpoint : IMinimalEndpoint
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{
builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/reserve-seat", ReserveSeat)
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("ReserveSeat")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<ReserveSeatResponseDto>()

View File

@ -5,6 +5,7 @@ using BuildingBlocks.Contracts.EventBus.Messages;
using BuildingBlocks.Core;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -43,7 +44,7 @@ public class RegisterNewUserEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("RegisterUser")
.WithApiVersionSet(builder.NewApiVersionSet("Identity").Build())
.Produces<RegisterNewUserResponseDto>()

View File

@ -6,6 +6,7 @@ using BookingMonolith.Passenger.Passengers.ValueObjects;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Core.Event;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -50,7 +51,7 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CompleteRegisterPassenger")
.WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build())
.Produces<CompleteRegisterPassengerResponseDto>()

View File

@ -4,6 +4,7 @@ using BookingMonolith.Passenger.Passengers.Dtos;
using BookingMonolith.Passenger.Passengers.Exceptions;
using BuildingBlocks.Core.CQRS;
using BuildingBlocks.Web;
using Duende.IdentityServer.EntityFramework.Entities;
using FluentValidation;
using Mapster;
using MapsterMapper;
@ -35,7 +36,7 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetPassengerById")
.WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build())
.Produces<GetPassengerByIdResponseDto>()

View File

@ -50,7 +50,7 @@ public class CreateBookingEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateBooking")
.WithApiVersionSet(builder.NewApiVersionSet("Booking").Build())
.Produces<CreateBookingResponseDto>()

View File

@ -54,7 +54,7 @@ public class CreateAircraftEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateAircraft")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateAircraftResponseDto>()

View File

@ -51,7 +51,7 @@ public class CreateAirportEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateAirport")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateAirportResponseDto>()

View File

@ -59,7 +59,7 @@ public class CreateFlightEndpoint : IMinimalEndpoint
return Results.CreatedAtRoute("GetFlightById", new { id = result.Id }, response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateFlight")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateFlightResponseDto>(StatusCodes.Status201Created)

View File

@ -45,7 +45,7 @@ public class DeleteFlightEndpoint : IMinimalEndpoint
return Results.NoContent();
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("DeleteFlight")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces(StatusCodes.Status204NoContent)

View File

@ -46,7 +46,7 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetAvailableFlights")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<GetAvailableFlightsResponseDto>()

View File

@ -39,7 +39,7 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetFlightById")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<GetFlightByIdResponseDto>()

View File

@ -56,7 +56,7 @@ public class UpdateFlightEndpoint : IMinimalEndpoint
return Results.NoContent();
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("UpdateFlight")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces(StatusCodes.Status204NoContent)

View File

@ -44,7 +44,7 @@ public class CreateSeatEndpoint : IMinimalEndpoint
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{
builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/seat", CreateSeat)
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CreateSeat")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<CreateSeatResponseDto>()

View File

@ -34,7 +34,7 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{
builder.MapGet($"{EndpointConfig.BaseApiPath}/flight/get-available-seats/{{id}}", GetAvailableSeats)
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetAvailableSeats")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<GetAvailableSeatsResponseDto>()

View File

@ -35,7 +35,7 @@ public class ReserveSeatEndpoint : IMinimalEndpoint
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
{
builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/reserve-seat", ReserveSeat)
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("ReserveSeat")
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
.Produces<ReserveSeatResponseDto>()

View File

@ -1,3 +1,5 @@
using Duende.IdentityServer.EntityFramework.Entities;
namespace Identity.Identity.Features.RegisteringNewUser.V1;
using System;
@ -47,7 +49,7 @@ public class RegisterNewUserEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("RegisterUser")
.WithApiVersionSet(builder.NewApiVersionSet("Identity").Build())
.Produces<RegisterNewUserResponseDto>()

View File

@ -41,7 +41,7 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
{
builder.MapPost($"{EndpointConfig.BaseApiPath}/passenger/complete-registration", async (
CompleteRegisterPassengerRequestDto request, IMapper mapper,
IMediator mediator, CancellationToken cancellationToken) =>
IMediator mediator, CancellationToken cancellationToken, IHttpContextAccessor httpContextAccessor) =>
{
var command = mapper.Map<CompleteRegisterPassenger>(request);
@ -51,7 +51,7 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("CompleteRegisterPassenger")
.WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build())
.Produces<CompleteRegisterPassengerResponseDto>()

View File

@ -36,7 +36,7 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint
return Results.Ok(response);
})
.RequireAuthorization()
.RequireAuthorization(nameof(ApiScope))
.WithName("GetPassengerById")
.WithApiVersionSet(builder.NewApiVersionSet("Passenger").Build())
.Produces<GetPassengerByIdResponseDto>()

View File

@ -1,5 +1,6 @@
using BuildingBlocks.Web;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
namespace BuildingBlocks.Jwt;
@ -40,13 +41,28 @@ public static class JwtExtensions
{
services.AddAuthorization(
options =>
options.AddPolicy(
nameof(ApiScope),
policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("scope", jwtOptions.Audience);
}));
{
// Set JWT as the default scheme for all [Authorize] attributes
options.DefaultPolicy =
new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
// Add your scope policy (optional)
if (!string.IsNullOrEmpty(jwtOptions.Audience))
{
options.AddPolicy(
nameof(ApiScope),
policy =>
{
policy.AuthenticationSchemes.Add(
JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.RequireClaim("scope", jwtOptions.Audience);
});
}
});
}
return services;