Netherlands - Generic Functions for data exchange Implementation Guide
0.3.0 - ci-build
Netherlands - Generic Functions for data exchange Implementation Guide - Local Development build (v0.3.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
The PatientEnrollmentCredential proves that a patient is enrolled with a healthcare provider organization.
It is the Verifiable Credential counterpart of the AORTA SAML enrollment token (inschrijftoken).
The credential is signed by a healthcare professional or named employee who has performed the BSN validation.
It is one way of asserting a patient care-giving relationship between a patient and a healthcare provider, which is a legal basis requirement for some healthcare data exchanges.
Purpose: Assert that a patient (identified by BSN) is enrolled with a healthcare provider organization, signed by the healthcare worker who performed the BSN validation. The credential establishes a patient care-giving relationship that can serve as the legal basis for subsequent healthcare data exchanges.
Issuer: did:x509 of the healthcare professional or named employee that signs the credential. The certificate MUST be a UZI healthcare professional pass (pastype Z) or a named employee pass (pastype N); other pastypes MUST be rejected.
Subject: did:web of the healthcare provider organization the patient is enrolled with.
Status: draft
VC type: ["VerifiableCredential", "PatientEnrollmentCredential"]
Trust anchors: PKIoverheid intermediate CAs for UZI healthcare professional and named employee passes, or future GIS-VN intermediate CAs.
This credential replaces the AORTA SAML enrollment token used to register a patient with a care organization. The signer (a healthcare worker on a Z- or N-pas) takes responsibility for the BSN validation procedure.
The credential names the healthcare provider organization the patient is enrolled with (hasEnrollment.issuedTo) by its URA number. The binding between that URA number and the subject did:web of the healthcare provider must still be established through a separate HealthcareProviderCredential presented in the same Verifiable Presentation.
The HealthcareWorker type is used regardless of whether the signer holds a healthcare professional pass (pastype Z) or a named employee pass (pastype N). Since HealthcareProfessional is a subtype of HealthcareWorker, both cases are covered. The role code is not relevant to the enrollment and is therefore not included.
All fields below are scoped to credentialSubject.
| Path | IRI | Card. | Description / validation |
|---|---|---|---|
id |
- | 1 | did:web of the healthcare provider organization |
@type |
gis:HealthcareProvider |
1 | Always HealthcareProvider |
hasEnrollment.@type |
gis:PatientEnrollment |
1 | Always PatientEnrollment |
hasEnrollment.issuedTo.@type |
gis:HealthcareProvider |
1 | Always HealthcareProvider |
hasEnrollment.issuedTo.identifier.@type |
schema:PropertyValue |
1 | Always Identifier |
hasEnrollment.issuedTo.identifier.system |
schema:propertyID |
1 | Always http://fhir.nl/fhir/NamingSystem/ura |
hasEnrollment.issuedTo.identifier.value |
schema:value |
1 | URA number of the healthcare provider organization the patient is enrolled with |
hasEnrollment.patient.@type |
gis:Patient |
1 | Always Patient |
hasEnrollment.patient.identifier.@type |
schema:PropertyValue |
1 | Always Identifier |
hasEnrollment.patient.identifier.system |
schema:propertyID |
1 | Always http://fhir.nl/fhir/NamingSystem/bsn |
hasEnrollment.patient.identifier.value |
schema:value |
1 | BSN of the patient |
hasEnrollment.enrolledBy.@type |
gis:HealthcareWorker |
1 | Always HealthcareWorker |
hasEnrollment.enrolledBy.identifier.@type |
schema:PropertyValue |
1 | Always Identifier |
hasEnrollment.enrolledBy.identifier.system |
schema:propertyID |
1 | Always http://fhir.nl/fhir/NamingSystem/uzi-nr-pers |
hasEnrollment.enrolledBy.identifier.value |
schema:value |
1 | UZI number of the executor; MUST correspond to the UZI number in the issuer DID |
The credential expresses the following entity model:
graph TD
VC[PatientEnrollmentCredential]
VC -->|issuer| ISSUER["did:x509 (UZI Z- or N-pas)"]
VC -->|credentialSubject| HP["HealthcareProvider"]
HP -->|id| HPID["did:web:huisarts-delinden.nl"]
HP -->|hasEnrollment| PE["PatientEnrollment"]
PE -->|issuedTo| ITO["HealthcareProvider"]
ITO -->|identifier| ITOID["Identifier"]
ITOID -->|system| ITOSYS["http://fhir.nl/fhir/NamingSystem/ura"]
ITOID -->|value| ITOVAL["12345678 (URA)"]
PE -->|patient| PAT["Patient"]
PAT -->|identifier| PATID["Identifier"]
PATID -->|system| PATSYS["http://fhir.nl/fhir/NamingSystem/bsn"]
PATID -->|value| PATVAL["999911234 (BSN)"]
PE -->|enrolledBy| HW["HealthcareWorker"]
HW -->|identifier| HWID["Identifier"]
HWID -->|system| HWSYS["http://fhir.nl/fhir/NamingSystem/uzi-nr-pers"]
HWID -->|value| HWVAL["90001234 (UZI-nr-pers)"]
The credential uses the GIS JSON-LD context.
The following is a non-normative example of a PatientEnrollmentCredential using the W3C Verifiable Credentials Data Model 1.1 JWT encoding. It asserts that the patient with BSN 999911234 is enrolled with the healthcare provider identified by did:web:huisarts-delinden.nl, as registered by a healthcare worker with UZI 90001234.
JWT Header:
{
"alg": "PS256",
"typ": "JWT",
"kid": "did:x509:0:sha256:YmFzZTY0...dHJ1c3Q=::san:otherName:2.16.528.1.1007.99.2110-1-12345678-Z-90001234-01.015-12345678#0",
"x5c": [
"MIIFjDCCA3SgAwIBAgIUe8Y...kortLeafCert...==",
"MIIFcDCCA1igAwIBAgIUa5B...kortIntermediateCert...==",
"MIIFZDCCAxygAwIBAgIUbGp...kortRootCert...=="
],
"x5t#S256": "dGhpcyBpcyBhIGV4YW1wbGUgdGh1bWJwcmludA"
}
JWT Payload:
{
"iss": "did:x509:0:sha256:YmFzZTY0...dHJ1c3Q=::san:otherName:2.16.528.1.1007.99.2110-1-12345678-Z-90001234-01.015-12345678",
"sub": "did:web:huisarts-delinden.nl",
"jti": "urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"nbf": 1740000000,
"exp": 1786320000,
"vc": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"http://gis-nl.example/"
],
"type": [
"VerifiableCredential",
"PatientEnrollmentCredential"
],
"issuanceDate": "2025-02-20T00:00:00Z",
"expirationDate": "2026-08-08T00:00:00Z",
"credentialSubject": {
"id": "did:web:huisarts-delinden.nl",
"@type": "HealthcareProvider",
"hasEnrollment": {
"@type": "PatientEnrollment",
"issuedTo": {
"@type": "HealthcareProvider",
"identifier": {
"@type": "Identifier",
"system": "http://fhir.nl/fhir/NamingSystem/ura",
"value": "12345678"
}
},
"patient": {
"@type": "Patient",
"identifier": {
"@type": "Identifier",
"system": "http://fhir.nl/fhir/NamingSystem/bsn",
"value": "999911234"
}
},
"enrolledBy": {
"@type": "HealthcareWorker",
"identifier": {
"@type": "Identifier",
"system": "http://fhir.nl/fhir/NamingSystem/uzi-nr-pers",
"value": "90001234"
}
}
}
}
}
}
In addition to the generic validation steps from the Credential Catalog, verifiers MUST perform the following checks:
did:x509 DID anchored in a trusted PKIoverheid intermediate CA for UZI healthcare professional or named employee passes (or a future GIS-VN intermediate CA).did:x509 MUST be Z (healthcare professional pass) or N (named employee pass). Other pastypes (e.g. M for non-named employee passes) MUST be rejected.credentialSubject.hasEnrollment.enrolledBy.identifier.value MUST correspond to the UZI number encoded in the issuer did:x509.expirationDate − issuanceDate) MUST NOT exceed 18 months, conforming to current AORTA policy for enrollment tokens.The CRL policy for enrollment tokens is handled by the generic key resolution (see Authentication): the key is resolved based on the issuanceDate of the credential. If the key was valid and not revoked at that time, the signature remains valid even if the key is later revoked.