Initial commit with inital CMS
This commit is contained in:
+38
@@ -0,0 +1,38 @@
|
||||
# Business Rules — Unit 02: Identity & RBAC
|
||||
|
||||
Dit document beschrijft de validatieregels en logica voor identiteitsbeheer en autorisatie.
|
||||
|
||||
## 1. Hiërarchische Rollen (BR-ID-01)
|
||||
|
||||
- **Hiërarchie**: Owner (100) > Administrator (50) > User (10).
|
||||
- **Beperking**: Een gebruiker kan alleen acties uitvoeren op gebruikers met een **lagere** rol in de hiërarchie.
|
||||
- Uitzondering: Een Owner kan acties uitvoeren op andere Owners (bijv. de-activeren, mits niet de laatste Owner).
|
||||
- Een Administrator kan een User beheren, maar geen andere Administrator of Owner.
|
||||
- **Rolverandering**: Een gebruiker kan een andere gebruiker nooit een rol toekennen die hoger is dan zijn eigen rol.
|
||||
|
||||
## 2. Gebruikerscreatie & Uitnodiging (BR-ID-02)
|
||||
|
||||
- **Geen Zelfregistratie**: Het systeem staat geen publieke registratie toe.
|
||||
- **Uitnodigingsflow**:
|
||||
1. Administrator/Owner maakt een uitnodiging aan (e-mail + rol).
|
||||
2. Systeem genereert een `InvitationToken` met een beperkte geldigheidsduur (bijv. 24 uur).
|
||||
3. Gebruiker moet via een specifiek endpoint (`POST /api/setup/complete-invitation`) zijn wachtwoord instellen met dit token.
|
||||
4. Na succesvolle instelling wordt het token ongeldig en het account geactiveerd.
|
||||
|
||||
## 3. Bootstrapping (BR-ID-03)
|
||||
|
||||
- **Setup Endpoint**: Bij een lege database is een eenmalig endpoint `POST /api/setup/init` beschikbaar.
|
||||
- **Eerste Owner**: Dit endpoint accepteert de gegevens voor de eerste Owner. Na succesvolle aanmaak wordt dit endpoint permanent geblokkeerd of verwijderd uit de routing.
|
||||
|
||||
## 4. Authenticatie & Sessies (BR-ID-04)
|
||||
|
||||
- **Wachtwoord Hashen**: Wachtwoorden moeten gehasht worden volgens de ASP.NET Core Identity standaard (PBKDF2 met HMAC-SHA256).
|
||||
- **Refresh Tokens**:
|
||||
- Refresh tokens zijn gekoppeld aan een specifieke gebruiker en client/apparaat.
|
||||
- Refresh tokens kunnen maar één keer worden gebruikt (Rotation-principe).
|
||||
- Bij gebruik van een oud refresh token worden alle actieve sessies van die gebruiker ongeldig gemaakt (beveiligingsmaatregel tegen token diefstal).
|
||||
|
||||
## 5. Module-specifieke Rechten (BR-ID-05)
|
||||
|
||||
- **Fine-grained Access**: Naast de globale rollen kunnen Beheerders specifieke rechten per module toekennen aan Users.
|
||||
- **Default**: Zonder expliciete module-rechten heeft een User alleen leesrechten of basisrechten binnen een module (afhankelijk van de module-implementatie).
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
# Domain Entities — Unit 02: Identity & RBAC
|
||||
|
||||
Dit document beschrijft de data-entiteiten die nodig zijn voor identiteitsbeheer.
|
||||
|
||||
## 1. ApplicationUser
|
||||
|
||||
Breidt de standaard `IdentityUser` uit.
|
||||
|
||||
- **Email**: Unieke identifier.
|
||||
- **Role**: De primaire hiërarchische rol (`Owner`, `Administrator`, `User`).
|
||||
- **IsActive**: Boolean status.
|
||||
- **CreatedAt**: Tijdstip van aanmaak.
|
||||
- **ModulePermissions**: Navigatie-eigenschap naar module-specifieke rechten.
|
||||
|
||||
## 2. RefreshToken
|
||||
|
||||
- **Id**: Guid.
|
||||
- **Token**: De gehashte token string.
|
||||
- **UserId**: Link naar de `ApplicationUser`.
|
||||
- **ExpiryDate**: Wanneer het token verloopt.
|
||||
- **IsUsed**: Boolean (voor re-use detection).
|
||||
- **IsRevoked**: Boolean (handmatige intrekking).
|
||||
- **CreatedByIp**: IP adres voor audit trail.
|
||||
|
||||
## 3. Invitation
|
||||
|
||||
- **Email**: Adres waar de uitnodiging naar verzonden is.
|
||||
- **Role**: De toegekende rol na acceptatie.
|
||||
- **Token**: Unieke GUID/String.
|
||||
- **ExpiryDate**: Geldigheidsduur van de uitnodiging.
|
||||
- **IsAccepted**: Boolean.
|
||||
|
||||
## 4. ModulePermission
|
||||
|
||||
- **UserId**: Link naar `ApplicationUser`.
|
||||
- **ModuleName**: Naam van de module.
|
||||
- **Permission**: De specifieke string-gebaseerde permissie (bijv. "Write", "Admin").
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
# Business Logic Model — Unit 02: Identity & RBAC
|
||||
|
||||
Dit document beschrijft de processen en datastromen voor authenticatie en autorisatie.
|
||||
|
||||
## 1. Authenticatie Flow (JWT)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client
|
||||
participant AuthController
|
||||
participant AuthService
|
||||
participant UserManager
|
||||
participant Database
|
||||
|
||||
Client->>AuthController: Login(Email, Password)
|
||||
AuthController->>AuthService: AuthenticateAsync(Email, Password)
|
||||
AuthService->>UserManager: FindByEmailAsync(Email)
|
||||
UserManager->>Database: Get User
|
||||
Database-->>UserManager: User Data
|
||||
UserManager->>UserManager: CheckPasswordAsync(User, Password)
|
||||
AuthService->>AuthService: GenerateTokens(User)
|
||||
AuthService->>Database: Save RefreshToken
|
||||
AuthService-->>AuthController: AccessToken, RefreshToken
|
||||
AuthController-->>Client: 200 OK (Tokens)
|
||||
```
|
||||
|
||||
## 2. Uitnodigingsproces
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Admin/Owner] -->|Create Invitation| B(InvitationService)
|
||||
B -->|Generate Token| C(InvitationToken)
|
||||
C -->|Save to DB| D[(Database)]
|
||||
B -->|Send Email| E[User]
|
||||
E -->|Click Link| F[Setup Page]
|
||||
F -->|Submit Password + Token| G(SetupController)
|
||||
G -->|Validate Token| B
|
||||
B -->|Create Account| H(UserManager)
|
||||
H -->|Activate User| D
|
||||
```
|
||||
|
||||
## 3. Hiërarchische Autorisatie Logic
|
||||
|
||||
De autorisatie wordt afgehandeld via ASP.NET Core `AuthorizationPolicies`.
|
||||
|
||||
- **Policy: `RequireLowerRole`**:
|
||||
- Haalt de rol van de huidige gebruiker (X) en de doelgebruiker (Y) op.
|
||||
- Vergelijkt de numerieke waarden van de rollen.
|
||||
- Slaagt alleen als `RoleValue(X) > RoleValue(Y)` (of `X == Y` en `X == Owner`).
|
||||
|
||||
## 4. Token Refresh Logic
|
||||
|
||||
1. Client stuurt `Expired Access Token` + `Refresh Token`.
|
||||
2. Systeem controleert of `Refresh Token` bestaat in de database en niet verlopen is.
|
||||
3. Systeem controleert of `Refresh Token` al eerder is gebruikt (Re-use detection).
|
||||
4. Indien geldig:
|
||||
- Genereer nieuw `Access Token`.
|
||||
- Genereer nieuw `Refresh Token` (Rotation).
|
||||
- Verwijder/Invalideer het oude `Refresh Token`.
|
||||
5. Indien ongeldig of re-use:
|
||||
- Trek alle tokens van de gebruiker in.
|
||||
- Retourneer `401 Unauthorized`.
|
||||
Reference in New Issue
Block a user