Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Navitabs
rootSecurity API - Leverancebeskrivelse
includeroottrue



Table of Contents

Introduktion

Dette dokument beskriver NSP Security API til brugerautentificering og autorisering på NSP.

Først vises hvordan NSP Security API rent praktisk indføres i en NSP komponent med konkrete eksempler på anvendelse.

Denne sektion er især relevant for udviklere, der skal bruge NSP Security API i forbindelse med en konkret opgave. Det anvendelsesorienterede afsnit Dette dokument er delt op i følgende underafsnit:

  1. Tekniksk anvendelse af NSP Security API i NSP komponenter
    1. Teknisk opsætning og
    Teknik
    1. Dependency management: Viser, hvordan Maven dependency management samt deployment descriptors til NSP base Docker image anvendes til at få de nødvendige afhængigheder på plads for anvendelse af NSP Security API.
    2. Snitfladebeskrivelser og fejlhåndtering
    Brugermodellering og mapning: Viser, hvordan en komponent kan anvende håndtagene i
  2. Aktørmodellering og dokumentation
    1. Understøttede brugertyper og dokumentation i Brugerhistorier
    2. Mapning fra NSP Security API til
  3. at verficere indkommende kald. Herunder også dokumentation.

...

    1. understøttede brugertyper og dokumentation i Design og Arkitektur
    2. Konkrete eksempler på sikkerhedsbilletter

Teknisk anvendelse af NSP Security API i NSP komponenter

For at anvende NSP Security API i en konkret NSP komponent i udviklingsmæssig sammenhæng, så er der et par tekniske øvelser, der skal være på plads. Da hovedparten af NSP'ens komponenter er bygget op på samme måde, så vil denne vejledning umiddelbart kunne anvendes i langt de fleste tilfælde. Antagelsen i denne vejledning er derfor at:

...

I de følgende afsnit gennemgåes først, hvordan en komponent forberedes teknisk til at kunne anvende NSP Security API ved at udtrykke både en kodemæssig og en afviklingsmæssig afhængighed til NSP Security API.

Dernæst vises det med et praktisk eksempel hentet fra DROS og Dokumentdelingsservicen, hvordan NSP Security API bliver anvendt i dokumentation og applikationskode til at implementere brugerautentificering og -autorisation.

Det er vigtigt at notere sig, at eksempler i denne anvenderguide er ment som inspiration til anvendere af NSP Security API. Det er således ikke en udtømmende facitliste. Anvendelsen af NSP Security API kræver komponentspecifikke og forretningsspecifikke overvejelser:

  • Hvilke brugertyper er til stede i min komponent?
  • Hvordan skal disse brugertyper tjekkes/mappes i forhold til de forretningsregler, der gælder i min komponent?

Teknisk opsætning og anvendelse af NSP Security API

I forgående afsnit blev det fremhævet, at det ikke er en NSP komponents ansvar selv at inkludere NSP Security API i dens færdigbyggede modul.

I stedet udtrykker komponenten, at den regner med, at de omgivelser, hvori den efterfølgende afvikles, stiller NSP Security API til rådighed på afviklingstidspunktet.

Maven Dependency Management

Teknisk opsætning og anvendelse af NSP Security API

I forgående afsnit blev det fremhævet, at det ikke er en NSP komponents ansvar selv at inkludere NSP Security API i dens færdigbyggede modul.

I stedet udtrykker komponenten, at den regner med, at de omgivelser, hvori den efterfølgende afvikles, stiller NSP Security API til rådighed på afviklingstidspunktet.

Maven Dependency Management

Her vises hvordan Maven dependency management samt deployment descriptors til NSP base Docker image anvendes til at få de nødvendige afhængigheder på plads for anvendelse af NSP Security API.

Langt de fleste NSP komponenter anvender Maven til at holde Langt de fleste NSP komponenter anvender Maven til at holde styr på afhængigheder til tredjeparts biblioteker.

...

Code Block
languagexml
<dependency>
    <groupId>dk.sds.nsp.security</groupId>
    <artifactId>security-api</artifactId>
    <version>1.0.6<11</version>
    <scope>provided</scope>
</dependency>

...

Afviklingsomgivelserne for en NSP komponent er Wildfly (evt via et af NSP'ens Docker images). I det følgende afsnit vises, hvordan man sørger for, at Wildfly rent faktisk stiller NSP Security API til rådighed for den anvendende komponent og derved opfylder kontrakten, som blev udtrykt i Maven konfigurationsfilen.

Wildfly Dependency Management

Afviklingsomgivelserne for en standard NSP komponent er Wildfly (evt via et af NSP'ens Docker images). På Wildfly findes en række tredjeparts biblioteker, der leveres med platformen - herunder også NSP Security API.

...

Code Block
titleTjek af version af NSP Security API i Wildfly
root@7e07691acb13:~# cd /tmp
root@7e07691acb13:/tmp# jar xf /pack/wildfly/modules/system/layers/base/dk/sds/nsp/security/main/nsp-security-api.jar
root@7e07691acb13:/tmp# cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Implementation-Title: NSP Security API
Implementation-Version: 
Archiver-Version: Plexus Archiver
Built-By: root
Created-By: Apache Maven 3.59.4
Build-Jdk: 1.8.0_275362
Specification-Version: 1.0.611

I ovenstående eksempel er det NSP Security API version 1.0.611, der stilles til rådighed af den konkrete version af Wildfly, hvilket hænger fint sammen med det versionsnummer, der blev udtrykt i Maven afhængigheden (i pom.xml).

Snitfladebeskrivelser og fejlhåndtering

Førhen håndterede og verificerede komponenterne selv sikkerheden. Det gav derfor mening, at sikkerhedsmodellen blev udtrykt i snitfladebeskrivelserne for komponenterne. I flere komponenter har vi således for nuværende flere versioner af den samme snitflade: En til DGWS og en til IDWS.

Med introduktionen af NSP Security API er det ikke længere nødvendigt for den enkelte komponent at beskrive og håndtere DGWS og IDWS konkret i koden. Det kan derfor lade sig gøre at udstille snitfladebeskrivelser, der er renset for sikkerhedsprotokollen, da komponenten kan anvende NSP Security API.

Hvis komponenterne renses for sikkerhedsprotokol-afhængige snitfladebeskrivelser og kode, vil der på sigt blive mindre kode at vedligeholde.

I forhold til at rapportere fejl tilbage til anvenderne ville man før NSP Security API være tvunget til at gøre dette på en sikkerhedsprotokolafhængig måde f.eks. ved at sende en DGWSFault tilbage.

I forhold til at rapportere fejl tilbage til anvenderne ville man før NSP Security API være tvunget til at gøre dette på en sikkerhedsprotokolafhængig måde f.eks. ved at sende en DGWSFault tilbage.
For SOAP services giver NSP Security API ansvaret for at levere fejl tilbage til anvenderne på den rigtige (i praksis DGWS-agtige eller IDWS-agtige) måde til NSP Security API. Komponenten skal blot kaste en javax.xml.ws.soap.SOAPFaultException, og så vil platformen tage sig af resten.

Med tiden er der opstået behov for at NSP Security API kan håndtere REST baserede services og JSON Web token  (JTP-H profil). Komponenter der gør brug af dette, leverer eventuelle fejl tilbage til anvenderen i selve REST-kaldet i JSON format.Med introduktionen af NSP Security API gives ansvaret for at levere fejl tilbage til anvenderne på den rigtige (i praksis DGWS-agtige eller IDWS-agtige) måde til NSP Security API. Komponenten skal blot kaste en javax.xml.ws.soap.SOAPFaultException, og så vil platformen tage sig af resten.


Aktørmodellering og dokumentation

Som nævnt i første afsnit, stiller NSP Security API en række håndtag til rådighed for den anvendende komponent. Det er komponentens egen opgave at:

...

Disse tre punkter er beskrevet i de følgende afsnit

Understøttede brugertyper og dokumentation i Brugerhistorier

...

, hvor der også vil være praktisk eksempler. Det er vigtigt at notere sig, at eksempler i denne anvenderguide er ment som inspiration til anvendere af NSP Security API.

Det er således ikke en udtømmende facitliste. Anvendelsen af NSP Security API kræver komponentspecifikke og forretningsspecifikke overvejelser:

  • Hvilke brugertyper er til stede i min komponent?
  • Hvordan skal disse brugertyper tjekkes/mappes i forhold til de forretningsregler, der gælder i min komponent?

Understøttede brugertyper og dokumentation i Brugerhistorier

En given NSP komponent skal forholde sig til, hvilke brugertyper den understøtter. Dette er i høj grad en forretningsmæssig beslutning, og det er vigtigt at en komponent dokumenterer de understøttede brugertyper. Dokumentationen af brugertyperne og de brugerhistorier, som de indgår i foretages i dokumenttypen Brugerhistorier. Et eksempel på et sådant dokument er DROS - Brugerhistorier. Mange eksisterende NSP komponenter har ikke dette dokument, men en succesfuld anvendelse af NSP Security API forudsætter, at det eksisterer. Derfor bør indførelsen af NSP Security API først ske efter, at denne dokumentation er udarbejdet. Denne dokumenttype er ikke et teknisk dokument og indholdet skal som minimum gennemlæses og verificeres af SDS NSP arkitekt og Product Owner.

Dokumentation af brugerhistorier er den forretningsrettede dokumentation af, hvad en komponent kan, og hvem der kan anvende den og er således også en forudsætning for at anvendere kan scope og designe deres integration i henhold til dokumentationen i Guide til Anvendere. Se f.eks. DROS - Guide til anvendere for et eksempel på at sammenholde anvenderguide og brugerhistorier.

TODO måske tilføje til design og arkitektur: Fremadrettet vil det give mening at ændringer til en NSP komponent udtrykkes som brugerhistorierSe i øvrigt Dokumentationskrav for NSP-platformen for at få et overblik over de dokumentationspakker, der bør være til stede i forbindelse med en NSP leverance.

Mapning fra NSP Security API til understøttede brugertyper og dokumentation i Design og Arkitektur

Når dokumentationen af de understøttede brugertyper er på plads, så skal den konkrete mapning og verifikation fra NSP Security APIs context til sin egen aktørmodel laves.

...

Til dokumentationsformål kan man for eksempel anvende følgende metode, hvor de to tilfælde dokumenteres i tabelformat som nedenstående (udgangspunktet er tabellen ovenfor i dokumentationen af NSP Security API.

Brugertypen Borger (borgerbillet)VerifikationMapning til DDS ServiceActorSecurityContextTicketAudienceMatche audience som findes som konfiguration i DokumentdelingsserviceValidityEr validMessageVerificeres ikke - må gerne være derActingUserUserTypeSkal være CitizenBrugertypen: BorgerIdentifierFormatSkal være CPRIdentifierSkal være satPersonIdentifierGivenNameVerificeres ikke - må gerne være derSurNameVerificeres ikke - må gerne være derCredentialsVerificeres ikke - må gerne være derPersistentUniqueKeyVerificeres ikke - må gerne være derPrincipalUserMå ikke være derOrganisationMå ikke være derClientVerificeres ikke - må gerne være der

Brugertypen Borger (sundhed.dk)

VerifikationMapning til DDS ServiceActorSecurityContextTicketAudienceVerificeres ikke - må gerne være derValidityEr validMessageVerificeres ikke - må gerne være derActingUserUserTypeMå ikke være derPrincipalUserUserTypeMå ikke være derOrganisationIdentifierFormatSkal være CVRIdentifierSkal være der og skal være "niveau 3" whitelistetNameVerificeres ikke - må gerne være derClientVerificeres ikke - må gerne være derHSUID HeaderDet verificeres, at HSUID headeren findes, og at den modellerer en borger

Brugertypen: Borger

PersonIdentifier

...

borgerbillet)VerifikationMapning til DDS ServiceActor
SecurityContextTicketAudienceMatche audience som findes som konfiguration i Dokumentdelingsservice 


IsValidEr valid

Message
Verificeres ikke - må gerne være der

ActingUserUserTypeSkal være CitizenBrugertypen: Borger


IdentifierFormatSkal være CPR


IdentifierSkal være satPersonIdentifier


GivenNameVerificeres ikke - må gerne være der


SurNameVerificeres ikke - må gerne være der


CredentialsVerificeres ikke - må gerne være der


PersistentUniqueKeyVerificeres ikke - må gerne være der

PrincipalUser
Må ikke være der

Organisation
Må ikke være der

Client
Verificeres ikke - må gerne være der

Brugertypen Borger (sundhed.dk)

VerifikationMapning til DDS ServiceActor
SecurityContextTicketAudienceVerificeres ikke - må gerne være der


IsValidEr valid

Message
Verificeres ikke - må gerne være der

ActingUserUserTypeMå ikke være der

PrincipalUserUserTypeMå ikke være der

OrganisationIdentifierFormatSkal være CVR


IdentifierSkal være der og skal være "niveau 3" whitelistet


NameVerificeres ikke - må gerne være der

Client
Verificeres ikke - må gerne være der

HSUID Header



Det verificeres, at HSUID headeren findes, og at den modellerer en borger.

NB. I praksis bør HSUID Headeren foldes ud, hvis den bruges, og anvendelsen af de enkelte egenskaber beskrives på samme måde som ovenstående egenskaber fra NSP Security API.

Brugertypen: Borger

PersonIdentifier

Konkrete eksempler på sikkerhedsbilletter

I det følgende vises tre konkrete eksempler på hvordan DGWS, IDWS og JTP-H kald ser ud når de omsættes til en NSP Security API sikkerhedsbillet.

Her efter kommer der nogle kodeeksempler, der viser hvordan en komponent kan anvende håndtagene i NSP Security API til at verficere indkommende kald.

Eksempel på DGWS billet

Hvis billetten indeholder denne SAML attribut, så er der tale om en DGWS billet:

Code Block
titleIdentifikation af DGWS billet
<saml:Attribute Name="sosi:IDCardVersion">
    <saml:AttributeValue>1.0.1</saml:AttributeValue>
</saml:Attribute>

Note: Både DGWS version 1.0 og 1.0.1 er understøttet i NSP Access Handler.

DGWS request:

Code Block
titleDGWS request
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:medcom="http://www.medcom.dk/dgws/2006/04/dgws-1.0.xsd"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:sosi="http://www.sosi.dk/sosi/2006/04/sosi-1.0.xsd"
    xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Envelope">
    <soapenv:Header>
        <wsse:Security>
            <wsu:Timestamp>
                <wsu:Created>2025-06-19T11:52:36Z</wsu:Created>
            </wsu:Timestamp>
            <saml:Assertion IssueInstant="2025-06-19T11:47:36Z" Version="2.0" id="IDCard"
                xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
                <saml:Issuer>TEST1-NSP-STS</saml:Issuer>
                <saml:Subject>
                    <saml:NameID Format="medcom:other">urn:uuid:30609219-f56d-430f-a9c2-9da7484146bb</saml:NameID>
                    <saml:SubjectConfirmation>
                        <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:2.0:cm:holder-of-key</saml:ConfirmationMethod>
                        <saml:SubjectConfirmationData>
                            <ds:KeyInfo>
                                <ds:KeyName>OCESSignature</ds:KeyName>
                            </ds:KeyInfo>
                        </saml:SubjectConfirmationData>
                    </saml:SubjectConfirmation>
                </saml:Subject>
                <saml:Conditions NotBefore="2025-06-19T11:47:36Z"
                    NotOnOrAfter="2025-06-20T11:47:36Z" />
                <saml:AttributeStatement id="IDCardData">
                    <saml:Attribute Name="sosi:IDCardID">
                        <saml:AttributeValue>e3iEGSXf41Zbfh+RoTABPA==</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="sosi:IDCardVersion">
                        <saml:AttributeValue>1.0.1</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="sosi:IDCardType">
                        <saml:AttributeValue>user</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="sosi:AuthenticationLevel">
                        <saml:AttributeValue>4</saml:AttributeValue>
                    </saml:Attribute>
                </saml:AttributeStatement>
                <saml:AttributeStatement id="UserLog">
                    <saml:Attribute Name="medcom:UserCivilRegistrationNumber">
                        <saml:AttributeValue>0911809931</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="medcom:UserGivenName">
                        <saml:AttributeValue>Edgar</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="medcom:UserSurName">
                        <saml:AttributeValue>Codd</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="medcom:UserRole">
                        <saml:AttributeValue>
                            urn:dk:healthcare:national-federation-role:code:41008:value:SpaerAdminR8</saml:AttributeValue>
                    </saml:Attribute>
                </saml:AttributeStatement>
                <saml:AttributeStatement id="SystemLog">
                    <saml:Attribute Name="medcom:ITSystemName">
                        <saml:AttributeValue>Service Consumer Test</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="medcom:CareProviderID" NameFormat="medcom:cvrnumber">
                        <saml:AttributeValue>33257872</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="medcom:CareProviderName">
                        <saml:AttributeValue>Sundhedsdatastyrelsen</saml:AttributeValue>
                    </saml:Attribute>
                </saml:AttributeStatement>
                <ds:Signature id="OCESSignature">
                    <ds:SignedInfo>
                        <ds:CanonicalizationMethod
                            Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                        <ds:Reference URI="#IDCard">
                            <ds:Transforms>
                                <ds:Transform
                                    Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                            </ds:Transforms>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                            <ds:DigestValue>dM+zngXyLFh5QFRVzbCbhJwP5Yg=</ds:DigestValue>
                        </ds:Reference>
                    </ds:SignedInfo>
                    <ds:SignatureValue>
                        VRAZOjMrCSXaD6K/ne/yp8YZt4c6iBzaPlPrISKrXep3pD/LZztSt1q4XvFJAVl4GiO67zERPiSY89kQ/XJqFLebo80dMorv/+BTOcLaAJC6zbY/9gYAkzERXZwkfQMxnMLmyZF6SBmfOcpt2s2pi7qBQXev3ubpDIadIbC3EAm7oR6nU4upomU71wlZVBVyRnxKMbLDxYXwjFh+ITVaihgFCoiHzmj32doRi1CO5qbmBlM0ekBckKfulhRAOYXPF8IfKpKzZjCSMYRnNsNNT9N5If3BL7MctIbUdfPzZ9Uit+ss7iliLuhArOGRzGX+abVOphzmih87QhXvUXUULa7ekTv+onlB3qKUgHZu89EwT3sbj5Vy4UkwvleqzXQzosfAQLpDzyuRshizLuNoczJ4VG4nmVj6sRbS+2deM9BU6R2PW+1D3thfdwc8F3XNb6PsTJJAX1Y2v5lwZKu/d5ft2N39EtzBpybHvi7P1GheqQO/XhAEv/lUHAaZuVHd</ds:SignatureValue>
                    <ds:KeyInfo>
                        <ds:X509Data>
                            <ds:X509Certificate>
                                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</ds:X509Certificate>
                        </ds:X509Data>
                    </ds:KeyInfo>
                </ds:Signature>
            </saml:Assertion>
        </wsse:Security>
        <medcom:Header>
            <medcom:SecurityLevel>4</medcom:SecurityLevel>
            <medcom:Linking>
                <medcom:FlowID>0d4c8217-fd48-4c43-a85d-c9f1a48eaec6</medcom:FlowID>
                <medcom:MessageID>346d3126-e1e5-47a0-bd4f-8e3735910d62</medcom:MessageID>
            </medcom:Linking>
            <medcom:RequireNonRepudiationReceipt>no</medcom:RequireNonRepudiationReceipt>
        </medcom:Header>
    </soapenv:Header>
    <soapenv:Body>
        <ns3:ConsentAddConstraint
            xmlns:ns3="http://sundhedsdatastyrelsen.dk/minspaerring/2022/02/07"
            xmlns:ns2="urn:dk:nsi:consentservices:types">
            <ConsentAdds>
                <ns2:citizenCPR>0505785556</ns2:citizenCPR>
                <ns2:what>
                    <ns2:includeSubOrganizations>false</ns2:includeSubOrganizations>
                    <ns2:organizationIdentifier>91331000016003</ns2:organizationIdentifier>
                    <ns2:referralEnd>2025-06-20T00:00:00+02:00</ns2:referralEnd>
                    <ns2:referralStart>2025-06-19T13:52:34+02:00</ns2:referralStart>
                </ns2:what>
                <ns2:validFromDate>2025-06-19T13:52:34+02:00</ns2:validFromDate>
            </ConsentAdds>
        </ns3:ConsentAddConstraint>
    </soapenv:Body>
</soapenv:Envelope>


Resulterende sikkerhedsmodel:

Feltnavn (Niveau 1)Feltnavn (Niveau 2)Feltnavn (Niveau 3)Værdi
TicketisValid
true

Federation
Test

Audience


Created
2025-06-19T11:52:36Z

ValidFrom
2025-06-19T11:47:36Z

ValidTo
2025-06-20T11:47:36Z
MessageIdentifier
346d3126-e1e5-47a0-bd4f-8e3735910d62

ConversationIdentifier
0d4c8217-fd48-4c43-a85d-c9f1a48eaec6

Action

ActingUserType
HealthcareProfessional

IdentifierFormat
CPR

Identifier
0911809931

GivenName
Edgar

SurName
Codd

CredentialsAuthorizationCode


EducationCode


NationalRoleurn:dk:healthcare:national-federation-role:code:41008:value:SpaerAdminR8


UnverifiedRole


PowerOfAttorneyPrivileges

Age


Relation

OrganisationIdentifierFormat
CVR

Identifier33257872

NameSundhedsdatastyrelsen
ClientName
Service Consumer Test

PersistentUniqueKey


Eksempel på IDWS billet

Hvis billetten indeholder denne SAML attribut, så er der tale om en IDWS billet:

Code Block
titleIdentifikation af IDWS billet
<saml:Attribute Name="dk:gov:saml:attribute:SpecVer" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
    <saml:AttributeValue xsi:type="xs:string">DK-SAML-2.0</saml:AttributeValue>
</saml:Attribute>

IDWS request:

Code Block
titleIDWS request
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:sbf="urn:liberty:sb" xmlns:sbfprofile="urn:liberty:sb:profile"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header>
        <wsse:Security mustUnderstand="1" wsu:Id="security">
            <wsu:Timestamp wsu:Id="ts">
                <wsu:Created>2025-06-19T11:40:33Z</wsu:Created>
            </wsu:Timestamp>
            <saml:Assertion xmlns:xs="http://www.w3.org/2001/XMLSchema"
                ID="_ec8cceba-dec8-4a2e-9297-dbf4a4586998" IssueInstant="2025-06-19T11:40:33Z"
                Version="2.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <saml:Issuer>TEST1-NSP-STS</saml:Issuer>
                <ds:Signature Id="OCESSignature">
                    <ds:SignedInfo>
                        <ds:CanonicalizationMethod
                            Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                        <ds:Reference URI="#_ec8cceba-dec8-4a2e-9297-dbf4a4586998">
                            <ds:Transforms>
                                <ds:Transform
                                    Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                            </ds:Transforms>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                            <ds:DigestValue>jexkOGctE6bcSMRT4TqMjAd8FoY=</ds:DigestValue>
                        </ds:Reference>
                    </ds:SignedInfo>
                    <ds:SignatureValue>
                        R7BXDl2KnCekfIKJhdsbgrC6jSSOQTCKjqEET+9wpFuNAs+zYprN25bOJvDKgoViyFFQ3m71kHAPlJDoRcx1pUtBP7JWJ+YtoQzXce6Vg5iGYgZXWwAlvcotBGfQ8pkV/cPRBuTLG6pWBf8Y82tWpsimtjaQSgfka2zZxK+YGn578Tt5xMl2+nPjKefTTuaZJ/CiYK+WuLra7x4NN+f5reqVXUb96BJkK8JKlBlI/tdb2hpCqszh04sEOZ6NI/rIUh7g33r3vqOO410jWODhgD0HtyZ0+NyvqFnsX7nFIFiGsZDagZzxgO+5bE6ME8CZbDQwOCo33DMKrEgUAStp04AXj5yEW+5NNRsyYAvTXVbRne2EO+jap3vx74tyAWUViZkE/gm5so0pXZ3xyR8TZGJOkUwIqBlSFgL5IADMix5XWUEMHuv/5W6lGj7PAH+lQdsmBPZktCBrm0gx3AJUB+WyjP+001uIduKBjZDz234DGXt6fEGcHDMIOWwvZ+LQ</ds:SignatureValue>
                    <ds:KeyInfo>
                        <ds:X509Data>
                            <ds:X509Certificate>
                                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</ds:X509Certificate>
                        </ds:X509Data>
                    </ds:KeyInfo>
                </ds:Signature>
                <saml:Subject>
                    <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">
                        dk:gov:saml:attribute:CprNumberIdentifier:0606786666</saml:NameID>
                    <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:holder-of-key">
                        <saml:SubjectConfirmationData NotOnOrAfter="2025-06-19T11:45:33Z"
                            Recipient="https://audience.nspop.dk/minspaerring">
                            <ds:KeyInfo>
                                <ds:X509Data>
                                    <ds:X509Certificate>
                                        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</ds:X509Certificate>
                                </ds:X509Data>
                            </ds:KeyInfo>
                        </saml:SubjectConfirmationData>
                    </saml:SubjectConfirmation>
                </saml:Subject>
                <saml:Conditions NotBefore="2025-06-19T11:35:33Z"
                    NotOnOrAfter="2025-06-19T11:45:33Z">
                    <saml:AudienceRestriction>
                        <saml:Audience>https://audience.nspop.dk/minspaerring</saml:Audience>
                    </saml:AudienceRestriction>
                </saml:Conditions>
                <saml:AttributeStatement>
                    <saml:Attribute Name="dk:gov:saml:attribute:SpecVer"
                        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
                        <saml:AttributeValue xsi:type="xs:string">DK-SAML-2.0</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="dk:gov:saml:attribute:AssuranceLevel"
                        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
                        <saml:AttributeValue xsi:type="xs:string">3</saml:AttributeValue>
                    </saml:Attribute>
                    <saml:Attribute Name="dk:gov:saml:attribute:CprNumberIdentifier"
                        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
                        <saml:AttributeValue xsi:type="xs:string">0606786666</saml:AttributeValue>
                    </saml:Attribute>
                </saml:AttributeStatement>
            </saml:Assertion>
            <wsse:SecurityTokenReference
                xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wsswssecurity-secext-1.1.xsd"
                wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"
                wsu:Id="str">
                <wsse:KeyIdentifier
                    ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">
                    _ec8cceba-dec8-4a2e-9297-dbf4a4586998</wsse:KeyIdentifier>
            </wsse:SecurityTokenReference>
            <ds:Signature>
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                    <ds:Reference URI="#body">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>epbtquIxtP3WLvq5LA9g34ppHH8=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#ts">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>eV/t3qZZi3KIN8b6c8nEVk4tYo4=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#str">
                        <ds:Transforms>
                            <ds:Transform
                                Algorithm="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#STR-Transform">
                                <wsse:TransformationParameters>
                                    <ds:CanonicalizationMethod
                                        Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                                </wsse:TransformationParameters>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>jSy1ZmT7UXWQ0CX95A646d3kKs0=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#messageID">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>JxENTjL5EN9cABoD0gQGcN/M9HE=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#action">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>QwkYIg+CjKd2Gf5dGezYdZeyiSY=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#sbf">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>DrMuEoWp7Uik1KTUOuvtisxvpXA=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>
                    biF8u9LC9jy9F1hz8coeDT6rYCav8bXUHpS7Pms+2kt8FskDql0tQ3E4DPV7err9qdzDG8Y+E+31f/Fwbtmwdd6cfONMNozZXHk9D0ZEWkmgb+wtdYbQAmXZrTUR+RdGzevE+4Vct2uR1Xt9oe/fxO9TOAcTYoq33LhCC1TozNMxDMlN1lBLlNPpR9GkQgkVKG3WRWMSYy8naozBoEeMR5JBJdk8Cj1U0BN28iJ212DhhkIHCmlXRmbPx2iETIoh1aJeWKPtHnBRyBGNDjWjQP+u6W0aaIwk/ARY8QaRSyzQPRHgmhassxZZ+NGc8Cwxor9boVU5ypCGgI6DOA9Of9Nhug5citgKLUQCc+efIGM8cs/D+cABHUBLnod19Mj0O8ApDJtcvPWAL7dlJrZVSo3kqfOGaparKe8rkk1ku4Bk8LWyKrg6+ptDb23cHMBh3OYlGsJgGOCrpNYduwi/fa+Tuy4v4n3a/EqeyKyB75fAikmriUXvLXSQ+tppRJcd</ds:SignatureValue>
                <ds:KeyInfo>
                    <wsse:SecurityTokenReference
                        xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wsswssecurity-secext-1.1.xsd"
                        wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"
                        wsu:Id="sigStr">
                        <wsse:KeyIdentifier
                            ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID">
                            _ec8cceba-dec8-4a2e-9297-dbf4a4586998</wsse:KeyIdentifier>
                    </wsse:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
        </wsse:Security>
        <wsa:MessageID wsu:Id="messageID">fdbaaa66-102a-469a-bd96-c63db7b950e9</wsa:MessageID>
        <wsa:Action wsu:Id="action">urn:dk:nsi:consentservices:administration:service:1#ConsentAdd</wsa:Action>
        <sbf:Framework sbfprofile:profile="urn:liberty:sb:profile:basic" version="2.0" wsu:Id="sbf" />
    </soapenv:Header>
    <soapenv:Body wsu:Id="body">
        <ns3:ConsentAdd xmlns:ns3="urn:dk:nsi:consentservices:administration:service:1"
            xmlns:ns2="urn:dk:nsi:consentservices:types">
            <ConsentAdds>
                <ns2:citizenCPR>0606786666</ns2:citizenCPR>
                <ns2:positiveConsent>false</ns2:positiveConsent>
                <ns2:validFromDate>2025-06-19T13:40:32+02:00</ns2:validFromDate>
            </ConsentAdds>
        </ns3:ConsentAdd>
    </soapenv:Body>
</soapenv:Envelope>


Resulterende sikkerhedsmodel:

Feltnavn (Nivaeu 1)Feltnavn (Nivaeu 2)Værdi
TicketisValidtrue

FederationTest

Audiencehttps://audience.nspop.dk/minspaerring

Created2025-06-19T11:43Z

ValidFrom2025-06-19T11:38Z

ValidTo2025-06-19T11:48Z
MessageIdentifier7e2a1f0e-7fe8-4467-b81b-b305199462ea

ConversationIdentifier

Actionurn:dk:nsi:consentservices:administration:service:1#ConsentAdd
ActingUserTypeCitizen

IdentifierFormatCPR

Identifier0606786666

GivenName

SurName

Age

Relation
ClientNameMyTestSystem

PersistentUniqueKeyUI:DK-O:G:8d3fa047-c77e-47e4-bdd2-e91488610ce6

Eksempel på JTP-H token

Hvis Content-Type for requestet indeholder "JSON", så håndteres det som en JTP-H token, da det pt. er det eneste der er understøttet i NSP Access Handler.

Eksempel på JTP-H token:

image-2025-6-19_11-10-24.pngImage Added

Resulterende sikkerhedsmodel:

Feltnavn (Nivaeu 1)Feltnavn (Nivaeu 2)Værdi
TicketAudiencehttp://audience.nspop.dk/test

IsValidtrue

Created2025-06-19T11:14:48+02:00

ValidFrom2025-06-19T11:14:48+02:00

ValidTo2025-06-19T11:16:48+02:00
MessageIdentifier

ConversationIdentifier

Action
ActingUserTypeCitizen

IdentifierFormatCPR

Identifier1234567890

GivenNameHenning

SurNameThomsen

Age

RelationChildCustodyHolder

PersistentUniqueKey46f8cb60-4e29-42ba-8d08-501a34375b6b
PrincipalUserTypeCitizen

IdentifierFormatCPR

Identifier0987654321

GivenName

SurName

Age

RelationChild
ClientNameMyTestSystem

Implementation af validering og mapning af brugertyper

For at opnå en mere ensartet og let-gennemskuelig implemenation bør der tages udgangspunkt i følgende opbygning. Den enkelte trin (de blå) står for forskellige aspekter i mapnings- og valideringsprocessen inden resultatet gives videre til komponentens forretningslogik.

...

I det følgende gennemgås de enkelte trin (med et eksempel som forklaring).

Når kæden er tilendebragt, så er det op til komponenten at tjekke, om resultatet er tilfredsstillende: Understøtter vi f.eks. den pågældende Actor i den specifikke kontekst.

Eksempel på Actormodellering:

...

  • Doctor
  • Nurse
  • NurseOnBehalfOfDoctor
  • HealthCareProfessional
  • ExecutiveHealthCareProfessional
  • HealthCareProfessionalOnBehalfOfDoctor
  • TrustedSystemUser
  • ExecutiveHealthCareProfessional
  • HealthCareProfessionalOnBehalfOfDoctor
  • TrustedSystemUser

I dette eksempel vil komponenten efter hele kæden er færdig stå med en Actor. Den sidste i listen, TrustedSystemUser, giver i sig selv ikke mening i komponenten, hvorfor den skal afvises. Denne aktør er kun med som en midlertidig type: Den opstår under ActorProvider men forventes transformeret til en faktisk type i ActorTransformer.

ActorProvider: Match af brugertyper

Dette trin opererer udelukkende på NSP Security API og forsøger udfra undersøgelse af NSP Security API modellen at matche til een af komponentens brugertyper. Dette kan med fordel laves som en række af match-metoder (en til hver brugertype) på en ActorProvider-klasse i komponenten. En ActorProvider kan bestemme en Actor, hvis en-og-kun-en af de implementerede match metoder returnere en Actor. I dette tilfælde sendes denne videre i algoritmen - ellers kastes en Exception.

I match-metoderne er det kun attributterne på modellen i NSP SecurityAPI (SecurityContext) som ligger til grund for valget af Actor og det er klart at nogle af disse vil ikke kunne matche med vores nuværende DGWS/IDWS/JTP-H billetter, men fremtidige vil kunne, derfor skal vi stadig have dem med. Implementationen skal matche det, der er dokumenteret i komponentens design og arkitekturdokumentation.

...

Code Block
public Actor getActor(SecurityContext sc) throws SecurityException {
	if (sc.getTicket.isValid()) {
		throw new SecurityException("Sikkerhedsbilletten er ikke valid");
	}

	Actor doctor = matchDoctor(sc);
	Actor nurse = matchNurse(sc);
	Actor nurseOnBehalfOf = matchNurseOnBehalfOfDoctor(sc);
	Actor healthCareProfessional = matchHealthCareProfessional(sc);
 	Actor executiveHealthCareProfessional = matchExecutiveHealthCareProfessional(sc);
 	Actor healthCareProfessionalOnBehalfOfDoctor = matchHealthCareProfessionalOnBehalfOfDoctor(sc);
	Actor trustedSystemUser = matchTrustedSystemUser(sc);

	Actor actor = checkExactlyOneActorHasBeenDetemined(doctor, nurse, nurseOnBehalfOf, executiveHealthCareProfessional, healthCareProfessionalOnBehalfOfDoctor, trustedSystemUser);
	return actor;
}

private checkExactlyOneActorHasBeenDetemined(Actor determined...) throws SecurityException {
	// Tjekker, at der er præcist een ellers smides exception
}

private Actor matchDoctor(SecurityContext sc) {

	// Tjekker om nødvendige bruger og organisation findes. Der må ikke være en på-vegne-af-bruger i for denne aktør
	if (!sc.getActingUser().isPresent() || sc.getResponsibleUser().isPresent() || !sc.getOrganisation().isPresent()) {
		return null;
	}

	// Matcher brugertypen
	if (!sc.getActingUser().get().getUserType() != UserType.HealthcareProfessional) {
		return null;
 	}

	// Matcher identifier typen
 	if (!sc.getActingUser().get().getUserType().equals(UserType.HealthcareProfessional)) {
		return null;
 	}
 
	// Tjekker, at der er tale om en CPR identifier på brugeren
    ....
	// Tjek, at der findes en autorisationskode
    ....
	// Tjekker, at der findes en uddannelseskode og at den er af typen '7071' dvs læge
    ....
 
    return new DoctorActor(sc.getActingUser().get().getIdentifier(), sc.getActingUser().get().getCredentials().get().getAuthorizationCode().get());
}

private Actor matchTrustedSystemUser(SecurityContext sc) {

 	// Der må ikke være brugere tilstede på security context
	if (sc.getActingUser().isPresent() || sc.getResponsibleUser().isPresent()) {
		return null;
	}
 
	// Tjek, at der findes en organisation og at identifier typen for denne er CVR
    ....
	
    return new TrustedSystemUser(sc.getOrganisation().get().getIdentifier());
}

ActorTransformer: Transformerer en brugertype til en anden

Efter den umiddelbare matching af brugertyper i ActorProvider er der eksempler på, at en brugertype kan blive til en anden, hvis de rette omstændigheder er tilstede. I mange NSP services er det muligt at angive en mere detaljeret kontekst i en HSUID header. Dette kan implementeres i en ActorTransformer klasse, der kan tage andet kontekst end SecurityContexten, som vi var begrænset til i ActorProvideren.

...

Code Block
public Actor transformActor(Actor actor, ValidatedHsuidAttributes hsuid) throws SecurityException {

	if (actor.isTrustedSystemUser()) {

		// Tjek, at den trustede bruger har et CVR nummer, der er godkendt
		if (isTrusted(((TrustedSystemUser) actor).getCVR()))) {
		 	throw new SecurityException("CVR nummeret er ikke trustet");
		}

		// Hsuid skal angive, at der er tale om en sundhedsprofessionelbruger for at transformation kan foregå
		if (hsuid.isHealthCareProfessional()) {
			ValidatedHealthcareProfessionalHsuidAttributes healthcareProfHsuid = hsuid.getValidatedHealthcareProfessionalHsuidAttributes();
			String autorisationsId = validatedHealthcareProfessionalHsuidAttributes.getUserAuthorizationCode();
			String uddannelsesKode = verifyAutorisationsIdAndLookupUddannelsesKode(autorisationsId);
			// Tjekker, at uddannelseskode findes og identificerer en doktor			
			...
			// Tjekker om der er tale på vegne af
			if (healthcareProfHsuid.getResponsibleUserCivilRegistrationNumber() != null) {
				// Nu blev vi lige sundhedsfaglig på vegne af læge
				return new HealthCareProfessionalOnBehalfOfDoctor(healthcareProfHsuid.getActingUserCivilRegistrationNumber(),
								healthcareProfHsuid.getResponsibleUserCivilRegistrationNumber(), autorisationsId);
			} else {
				// Nu blev vi læge
				return new DoctorActor(healthcareProfHsuid.getActingUserCivilRegistrationNumber(), autorisationsId);
			}
		}
	}

	return actor;
}

ActorEnricher: Tilføjer information til Actor

...

Det sidste led i kæder er medtaget for at kunne berige Actoren med yderligere information. F.eks. en SOR kode fra HSUID header, eller patient-kontekst fra requestet.

Dette kan implementeres i en klasse ActorEnricher i en metode f.eks. Til sidst kalder vi " public Actor enrichActor(Actor actor, HSUID ) " på en ActorEnricher somreturnerer den samme type actor men nu med en SOR kode da denne jo kun findes i HSUID lige nuhsuid).