Files
SnapOtter/apps/docs/nl/guide/saml.md
T
SnapOtterandGitHub 4963ab3bbd feat(docs-i18n): translate all documentation into 20 languages
All 181 docs markdown files translated into 20 languages (apps/docs/<locale>/**). Companion to the i18n code PR; admin-merged because the file count exceeds GitHub's per-PR CI trigger limit. Validated by pnpm i18n:check (all surfaces, 0 stale/missing) and a clean all-locale docs build.
2026-07-11 13:52:47 +08:00

225 lines
13 KiB
Markdown

---
description: "Stel SAML 2.0 Single Sign-On in voor SnapOtter. Stapsgewijze handleidingen voor Okta, Azure AD / Entra ID, Google Workspace en andere SAML-identiteitsproviders."
i18n_source_hash: 33dfb8b02a22
i18n_provenance: human
i18n_output_hash: 046e75acd88e
---
# SAML SSO {#saml-sso}
SnapOtter ondersteunt SAML 2.0 voor single sign-on. Gebruikers kunnen inloggen via een externe identiteitsprovider (Okta, Azure AD / Entra ID, Google Workspace of een standaard SAML 2.0-IdP) in plaats van lokale authenticatie met gebruikersnaam/wachtwoord.
::: tip Enterprise-functie
SAML SSO vereist een **team**- of **enterprise**-licentie met de `saml_sso`-functie. Als `SAML_ENABLED=true` is ingesteld zonder een geldige licentie, worden de SAML-routes stilzwijgend overgeslagen en wordt er een waarschuwing gelogd.
:::
## Vereisten {#prerequisites}
- Een draaiende SnapOtter-instantie bereikbaar op een publieke URL
- `EXTERNAL_URL` ingesteld op die publieke URL (bijv. `https://photos.example.com`)
- Een team- of enterprise-licentiesleutel met de `saml_sso`-functie
- Adminrechten voor je SAML-identiteitsprovider
## Snelstart {#quick-start}
Voeg deze omgevingsvariabelen toe aan je `docker-compose.yml`:
```yaml
services:
snapotter:
image: snapotter/snapotter:latest
environment:
EXTERNAL_URL: "https://photos.example.com"
SNAPOTTER_LICENSE_KEY: "your-license-key"
SAML_ENABLED: "true"
SAML_IDP_SSO_URL: "https://idp.example.com/sso/saml"
SAML_IDP_CERTIFICATE: |
MIICpDCCAYwCCQDU+pQ4pHgSpDANBgkqhkiG9w0BAQsFADAUMRIw
...your IdP's signing certificate in PEM format...
EAYHKoZIzj0CAQYFK4EEACIDYgAE
```
Herstart de container. Een knop "Aanmelden met SAML" (of het label ingesteld door `SAML_PROVIDER_NAME`) verschijnt op de aanmeldpagina.
## Configuratiereferentie {#configuration-reference}
| Variabele | Standaard | Beschrijving |
|---|---|---|
| `SAML_ENABLED` | `false` | SAML-login inschakelen. |
| `SAML_IDP_SSO_URL` | | SSO-eindpunt-URL van de IdP. **Vereist** wanneer SAML is ingeschakeld. |
| `SAML_IDP_CERTIFICATE` | | X.509-ondertekeningscertificaat van de IdP in PEM-formaat (de certificaattekst zelf, niet een bestandspad). **Vereist** wanneer SAML is ingeschakeld. |
| `EXTERNAL_URL` | | De publieke URL waarop SnapOtter bereikbaar is. **Vereist** wanneer SAML is ingeschakeld. |
| `SAML_ENTITY_ID` | `${EXTERNAL_URL}/api/auth/saml/metadata` | SP Entity ID / Audience URI verzonden naar de IdP. |
| `SAML_CALLBACK_URL` | `${EXTERNAL_URL}/api/auth/saml/callback` | Assertion Consumer Service (ACS)-URL. |
| `SAML_AUTO_CREATE_USERS` | `true` | Maak automatisch een lokaal gebruikersaccount aan bij de eerste SAML-login. |
| `SAML_AUTO_LINK_USERS` | `false` | Koppel een SAML-identiteit aan een bestaande lokale gebruiker als het e-mailadres overeenkomt. |
| `SAML_DEFAULT_ROLE` | `user` | Rol toegewezen aan automatisch aangemaakte SAML-gebruikers. Een van `admin`, `editor` of `user`. |
| `SAML_PROVIDER_NAME` | | Weergavelabel voor de SAML-aanmeldknop in de frontend (bijv. "Okta", "Azure AD"). Indien leeg, staat er "SAML" op de knop. |
| `SAML_USERNAME_ATTRIBUTE` | | SAML-assertie-attribuut dat als gebruikersnaam wordt gebruikt. Indien leeg, wordt teruggevallen op het lokale deel van de e-mail, daarna NameID. |
| `SAML_EMAIL_ATTRIBUTE` | `email` | SAML-assertie-attribuut dat als e-mailadres van de gebruiker wordt gebruikt. |
De server weigert te starten als `SAML_ENABLED=true` en een van de drie vereiste variabelen (`SAML_IDP_SSO_URL`, `SAML_IDP_CERTIFICATE`, `EXTERNAL_URL`) ontbreekt.
::: details Beveiligingsnotities
Zowel `wantAuthnResponseSigned` als `wantAssertionsSigned` zijn hardgecodeerd op `true`. SnapOtter wijst niet-ondertekende of onjuist ondertekende SAML-responses af. Asserties van een vertrouwde IdP worden behandeld als e-mailgeverifieerd.
Alleen SP-geïnitieerde login wordt ondersteund. SnapOtter ondersteunt geen IdP-geïnitieerde (ongevraagde) login of Single Logout (SLO). Uitloggen bij SnapOtter logt de gebruiker niet uit bij de IdP.
:::
## SP-metadata en URL's {#sp-metadata-and-urls}
Je IdP heeft drie waarden van SnapOtter nodig:
| Veld | Waarde |
|---|---|
| **ACS-URL** (Assertion Consumer Service) | `${EXTERNAL_URL}/api/auth/saml/callback` |
| **Entity ID** / **Audience URI** | `${EXTERNAL_URL}/api/auth/saml/metadata` |
| **SP-metadata** (XML) | `GET ${EXTERNAL_URL}/api/auth/saml/metadata` |
Als `EXTERNAL_URL` bijvoorbeeld `https://photos.example.com` is:
- ACS-URL: `https://photos.example.com/api/auth/saml/callback`
- Entity ID: `https://photos.example.com/api/auth/saml/metadata`
- Metadata-eindpunt: `https://photos.example.com/api/auth/saml/metadata` (retourneert XML)
Sommige IdP's kunnen de SP-metadata-URL rechtstreeks importeren, waardoor de ACS-URL en Entity ID automatisch worden ingevuld.
## Providerinstellingen {#provider-setup}
### Okta {#okta}
1. Ga in de Okta-adminconsole naar **Applications > Create App Integration**.
2. Selecteer **SAML 2.0** en klik op **Next**.
3. Stel een naam in (bijv. "SnapOtter") en klik op **Next**.
4. Configureer de SAML-instellingen:
- **Single sign-on URL**: Je ACS-URL (bijv. `https://photos.example.com/api/auth/saml/callback`)
- **Audience URI (SP Entity ID)**: Je Entity ID (bijv. `https://photos.example.com/api/auth/saml/metadata`)
- **Name ID format**: EmailAddress
- **Application username**: Email
5. Voeg onder **Attribute Statements** `email` toe, toegewezen aan `user.email`.
6. Klik op **Next**, daarna op **Finish**.
7. Ga naar het tabblad **Sign On**, klik op **View SAML setup instructions** en kopieer:
- **Identity Provider Single Sign-On URL** naar `SAML_IDP_SSO_URL`
- **X.509 Certificate** naar `SAML_IDP_CERTIFICATE`
### Azure AD / Entra ID {#azure-ad-entra-id}
1. Ga in de Azure-portal naar **Microsoft Entra ID > Enterprise applications > New application**.
2. Klik op **Create your own application**, noem het "SnapOtter" en selecteer **Integrate any other application you don't find in the gallery**.
3. Ga naar **Single sign-on > SAML** en klik op **Edit** in de sectie **Basic SAML Configuration**:
- **Identifier (Entity ID)**: Je Entity ID (bijv. `https://photos.example.com/api/auth/saml/metadata`)
- **Reply URL (ACS URL)**: Je ACS-URL (bijv. `https://photos.example.com/api/auth/saml/callback`)
4. Download onder **SAML Certificates** het **Certificate (Base64)**.
5. Kopieer onder **Set up SnapOtter** de **Login URL**.
6. Stel `SAML_IDP_SSO_URL` in op de Login URL en `SAML_IDP_CERTIFICATE` op de inhoud van het gedownloade certificaat.
7. Wijs gebruikers of groepen toe aan de applicatie onder **Users and groups**.
### Google Workspace {#google-workspace}
1. Ga in de Google-adminconsole naar **Apps > Web and mobile apps > Add app > Add custom SAML app**.
2. Noem de app "SnapOtter" en klik op **Continue**.
3. Kopieer op de pagina **Google Identity Provider details** de **SSO URL** en download het **Certificate**. Klik op **Continue**.
4. Configureer de Service Provider-details:
- **ACS URL**: Je ACS-URL (bijv. `https://photos.example.com/api/auth/saml/callback`)
- **Entity ID**: Je Entity ID (bijv. `https://photos.example.com/api/auth/saml/metadata`)
- **Name ID format**: EMAIL
- **Name ID**: Basic Information > Primary email
5. Klik op **Continue**, daarna op **Finish**.
6. Zet de app **ON** voor je organisatie-eenheden.
7. Stel `SAML_IDP_SSO_URL` in op de SSO URL uit stap 3 en `SAML_IDP_CERTIFICATE` op de inhoud van het gedownloade certificaat.
### Generieke SAML 2.0-IdP {#generic-saml-2-0-idp}
Voor elke SAML 2.0-compatibele identiteitsprovider:
1. Maak een nieuwe SAML-applicatie/serviceprovider aan in je IdP.
2. Stel de **ACS-URL** in op `${EXTERNAL_URL}/api/auth/saml/callback`.
3. Stel de **Entity ID** / **Audience** in op `${EXTERNAL_URL}/api/auth/saml/metadata`.
4. Configureer de IdP om het e-mailadres van de gebruiker te verzenden in een attribuut genaamd `email` (of stel `SAML_EMAIL_ATTRIBUTE` in om overeen te komen met de attribuutnaam van je IdP).
5. Kopieer de **IdP SSO URL** en het **ondertekeningscertificaat** naar `SAML_IDP_SSO_URL` en `SAML_IDP_CERTIFICATE`.
## Gebruikersprovisioning {#user-provisioning}
### Automatisch aanmaken {#auto-create}
Wanneer `SAML_AUTO_CREATE_USERS` op `true` staat (de standaard), wordt er een lokaal gebruikersaccount aangemaakt wanneer iemand voor het eerst via SAML inlogt. De rol wordt ingesteld op `SAML_DEFAULT_ROLE`.
De gebruikersnaam wordt afgeleid in deze volgorde:
1. De waarde van het assertie-attribuut opgegeven door `SAML_USERNAME_ATTRIBUTE` (indien ingesteld en aanwezig)
2. Het lokale deel van het e-mailadres (alles vóór `@`)
3. De SAML NameID
Als er een botsing van gebruikersnamen optreedt, wordt er een numeriek achtervoegsel toegevoegd (bijv. `jane` wordt `jane_2`).
### Automatisch koppelen {#auto-link}
Wanneer `SAML_AUTO_LINK_USERS` op `true` staat, koppelt SnapOtter een SAML-identiteit aan een bestaand lokaal account als de e-mailadressen overeenkomen. Dit is handig wanneer je vooraf aangemaakte gebruikersaccounts hebt en wilt dat ze SSO gaan gebruiken zonder hun gegevens te verliezen.
::: warning
Schakel automatisch koppelen alleen in als je je SAML-IdP vertrouwt om e-mailadressen te verifiëren. Een niet-geverifieerd e-mailadres van een verkeerd geconfigureerde IdP zou iemand in staat kunnen stellen het account van een andere gebruiker over te nemen.
:::
### Attribuuttoewijzing {#attribute-mapping}
| SnapOtter-veld | Bron | Configuratie |
|---|---|---|
| E-mail | Assertie-attribuut | `SAML_EMAIL_ATTRIBUTE` (standaard: `email`) |
| Gebruikersnaam | Assertie-attribuut, e-mail of NameID | `SAML_USERNAME_ATTRIBUTE` (zie afleidingsvolgorde hierboven) |
| Externe ID | NameID | Altijd de SAML NameID, niet configureerbaar |
## SSO-afdwinging {#sso-enforcement}
Als je wilt vereisen dat alle gebruikers via SAML (of OIDC) inloggen en lokale wachtwoordlogin wilt blokkeren, schakel dan SSO-afdwinging in:
1. Zorg dat de `sso_enforcement`-enterprisefunctie gelicentieerd is (beschikbaar op team- en enterprise-plannen).
2. Zet in **Admin Settings > Security** de schakelaar **SSO Enforcement** aan.
3. Stel een **break-glass-gebruikersnaam** in: dit is het ene lokale account dat nog steeds met een wachtwoord kan inloggen, voor noodtoegang als de IdP onbereikbaar is.
Wanneer SSO-afdwinging actief is, retourneert elke lokale inlogpoging (behalve voor de break-glass-gebruiker) een 403-fout met de melding "Local password login is disabled. Please use SSO."
::: tip
Configureer altijd een break-glass-gebruikersnaam voordat je SSO-afdwinging inschakelt. Zonder deze kun je buitengesloten raken van SnapOtter als je IdP uitvalt.
:::
## SAML naast OIDC gebruiken {#using-saml-alongside-oidc}
SAML en OIDC kunnen tegelijkertijd worden ingeschakeld. Wanneer beide actief zijn, toont de aanmeldpagina aparte knoppen voor elke provider (gelabeld door `SAML_PROVIDER_NAME` en `OIDC_PROVIDER_NAME`). Gebruikers kunnen met beide methoden inloggen.
Beide providers delen dezelfde instellingen voor automatisch aanmaken, automatisch koppelen en SSO-afdwinging onafhankelijk van elkaar: elk heeft zijn eigen `*_AUTO_CREATE_USERS`-, `*_AUTO_LINK_USERS`- en `*_DEFAULT_ROLE`-variabelen.
## Problemen oplossen {#troubleshooting}
### Assertievalidatie mislukt {#assertion-validation-failed}
De handtekening van de SAML-response of de assertiehandtekening kon niet worden geverifieerd. Controleer:
- Het certificaat in `SAML_IDP_CERTIFICATE` komt overeen met het huidige ondertekeningscertificaat in je IdP (certificaten roteren, dus controleer op vervaldatum)
- Het certificaat is in PEM-formaat (begint met `-----BEGIN CERTIFICATE-----`)
- Het certificaat is de volledige tekst, niet een bestandspad
- De ACS-URL en Entity ID geconfigureerd in je IdP komen exact overeen met de waarden van SnapOtter (schema, host, poort, pad)
### Ontbrekende attributen {#missing-attributes}
Als gebruikersnamen of e-mailadressen leeg zijn na het inloggen, verzendt je IdP mogelijk niet de verwachte attributen. Controleer:
- Je IdP is geconfigureerd om een `email`-attribuut vrij te geven (of waar `SAML_EMAIL_ATTRIBUTE` ook op is ingesteld)
- Verifieer bij gebruik van `SAML_USERNAME_ATTRIBUTE` dat dat attribuut in de assertie is opgenomen
- Sommige IdP's vereisen expliciete configuratie van attribuuttoewijzing voordat ze claims vrijgeven
### Klokverschil {#clock-skew}
SAML-asserties bevatten tijdstempelvoorwaarden (`NotBefore`, `NotOnOrAfter`). Als je serverklok en de klok van de IdP niet gelijklopen, mislukt de assertievalidatie. Draai NTP op beide machines om de klokken uitgelijnd te houden.
### "SAML is enabled via env but saml_sso enterprise feature is not licensed" {#saml-is-enabled-via-env-but-saml-sso-enterprise-feature-is-not-licensed}
Deze waarschuwing verschijnt in de serverlogs wanneer `SAML_ENABLED=true` maar de licentie de `saml_sso`-functie niet bevat. Verifieer je licentiesleutel en plan. De `saml_sso`-functie is beschikbaar op team- en enterprise-plannen.
### Login stuurt terug met fout {#login-redirects-back-with-error}
Als het klikken op de SAML-aanmeldknop je terugstuurt naar de aanmeldpagina met een fout, controleer dan de serverlogs voor details. Veelvoorkomende oorzaken:
- De IdP SSO URL is onbereikbaar vanaf de server
- De IdP heeft het authenticatieverzoek geweigerd (controleer de auditlogs van de IdP)
- De IdP retourneerde een niet-ondertekende response (SnapOtter vereist dat zowel de response als de assertie ondertekend zijn)