A production-ready starter template for building modular monolith applications using .NET 9.0, implementing the Backend-For-Frontend (BFF) pattern with Keycloak authentication.
If you’re not familiar with the modular monolith concept, you can find an explanation for this choice in the Evolutionary Architecture’s documentation.
-
Clean separation of concerns
-
Module-based structure
-
Easy to extend and maintain
-
BFF (Backend-For-Frontend) pattern implementation
-
Keycloak integration
-
Transactional Outbox Pattern implementation
-
Message-driven communication between modules
docker-compose up
Important
|
For local development with Docker Compose, additional setup is required to handle Keycloak authentication properly. Please refer to the Local Development Guide for detailed instructions. |
Note
|
Integrating the BFF with a front-end requires special attention, I recommend reading this detailed article: https://wrapt.dev/blog/standalone-duende-bff-for-any-spa |
The application will be available at:
-
Swagger UI: http://localhost:8080/swagger/index.html
src/
├── Starter/ # Main API application
├── Starter.BFF/ # Backend-For-Frontend application
├── Starter.Common/ # Shared libraries and utilities
├── Starter.UnitTests/ # Unit tests
└── Starter.IntegrationTests/ # Integration tests
The project uses Keycloak as the identity provider with the BFF pattern:
-
Frontend applications communicate with the BFF
-
BFF Authenticates user by cookie
-
If user is not authenticated, BFF challenges the user to Keycloak & deals a cookie[secure, http only and SameSite strict] to the front-end
-
BFF proxies authenticated requests to the main API
-
API validates JWT tokens and handles authorization
If you need to bypass the BFF and access the APIs directly, you can obtain an access token from Keycloak using the following command:
curl --location 'http://localhost:7002/realms/starter-realm/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username={your username}' \
--data-urlencode 'password={your password}' \
--data-urlencode 'client_id=starter-client' \
--data-urlencode 'client_secret=yNSMFyKxVUsL5g0xASiGXYs7RkZPQJ2h'
The response will contain an access token that can be used to authenticate direct API calls by including it in the Authorization
header as a Bearer token.
This project is based on the excellent work from the Evolutionary Architecture by Example repository. Special thanks to all the creators and contributors of the original project for providing such a great foundation for building modern .NET applications.
Original repository maintainers and contributors can be found at: https://github.com/evolutionary-architecture/evolutionary-architecture-by-example/graphs/contributors
This project is licensed under the MIT License - see the LICENSE file for details.