Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Ret fejl i kodeeksempel

...

Eksempler på genererede klasser er Security, Assertion og Header, som vises længere nede.En Header indeholder tekniske og logistiske data, der vedrører forsendelse af request. Specifikke detaljer om hvordan en Header laves kan ses i eksempler længere nede. TODO

En Security er det samlende element for sikkerhedsoplysninger i et request, som indeholder informationer om signering, token og kryptering. For at lave en Security, kræver det at man først har et ID-kort.


Seal.Net giver mulighed for at konstruere to forskellige ID-kort, UserIdCard og SystemIdCard, til anvendelse i fagsystemer indenfor sundhedsvæesnet. Disse konstrueres vha. klassen 'SOSIFactory'.

...

Seal.NET indeholder nogle IEndPointBehavior-klasser som kan benyttes af WCF services genereret ud fra WSDL. Disse er beskrevet længere nede under afsnittet EndpointBehaviors.

Klienter

Saml2SosiStsClient

Konverterer en SAML assertion til et ID kort.

Headers

Headers er typer/XML-elementer som primært bruges til sikkerhed i DGWS. I nogle sammenhænge kaldes disse derfor blot "sikkerhed". De kan dog også være mere generelle, og indeholde tekniske og logistiske data, der vedrører forsendelse af request. Brugen af de følgende headers vises i afsnittet med eksempler.

Security

En Security er det samlende element for sikkerhedsoplysninger i et request, som indeholder informationer om signering, token og kryptering. For at lave en Security, kræver det at man først har et ID-kort. I Seal.NET findes Security som en type med samme navn. Typen er dog blevet erstattet af IdCardMessageHeader, som tager et ID-kort, og sætter security elementet i requestet ud fra det.

DGWS Header 

En header med DGWS-specifikke detaljer. Sættes i et request med XmlMessageHeader.

Andre

WhiteListingHeader

Nogle services kræver flere headers end blot DGWS og security. F.eks. kræver FMK en whitelisting header, som den bruger til at foretage autorisation af klientsystemer. Denne header genereres med klienten som en type i kodebasen, når klienten genereres ud  fra FMK's WSDL. Med andre ord indeholder WSDL-filen hvilke headers der er påkrævet.

Klienter

Saml2SosiStsClient

Konverterer en SAML assertion til et ID kort.

Sosi2SamlStsClientSosi2SamlStsClient

Konverterer et ID kort til en SAML assertion, enten via direkte kald til STS eller via SOSI Gateway.

...

Code Block
languagec#
var client = new NSTWsProvider.NtsWSProviderClient(new BasicHttpBinding(), new EndpointAddress("https://test1-cnsp.ekstern-test.nspop.dk:8443/nts/service"));
 
client.Endpoint.EndpointBehaviors.Add(new ViaBehavior(new Uri("http://test1.ekstern-test.nspop.dk:8080/sosigw/proxy/soap-request"))); // Tilføj Via endpointbehavior

using (new OperationContextScope(client.InnerChannel))
{
    var = response client.invokeAsync("test");
}

...

En klient til en WebService af typen Den Gode Webservice benyttes som enhver anden webservice.
I Visual Studio tilføjes en Service-Reference til den pågældende WSDL. Herefter genereres en proxy indeholdende alle datatyper for webservicen.
Det er også muligt at benytte WCF svcutil tool hvis Visual Studio ikke er tilstrækkelig.

Det er en god ide at se kommentarerne igennem i kodeeksemplerne, da de også gælder i de efterfølgende eksempler.

Opstarts-eksempel med kald til NTS

...

Code Block
languagec#
var userInfo = new UserInfo(
    cpr,
    givenName,
    surName,
    email,
    occupation,
    role,
    authCode
);

var idCardRequest = SOSIFactory.CreateNewUserIdCard(
    systemName,
    userInfo,
    new CareProvider(systemCareProviderIdFormat, systemCareProviderId, systemCareProviderName),
    AuthenticationLevel.MocesTrustedUser,
    username,
    password,
    userCertificate,
	alternativeIdentifier 
); 

SOSIFactory factory = CreateFactory(); 
idCardRequest.Sign<Assertion>(factory.SignatureProvider); // Signér lokalt ID-kort
var idc = SealUtilities.SignIn( // Kald STS, og hvis den godkender det lokalt signerede ID-kort, fås et STS-signeret ID-kort
    idCardRequest,
    systemName,
    "http://test2.ekstern-test.nspop.dk:8080/sts/services/NewSecurityTokenService"
);

var client = new MedicineCardPortTypeClient(MedicineCardPortTypeClient.EndpointConfiguration.MedicineCardPort, new EndpointAddress(new Uri("https://test2.fmk.netic.dk/fmk12/ws/MedicineCard")));
var")));

using (new OperationContextScope(client.InnerChannel))
{
    // Adding seal-security and dgws-header soap header
    OperationContext.Current.OutgoingMessageHeaders.Add(IdCardHeader(idc));
    OperationContext.Current.OutgoingMessageHeaders.Add(XmlHeader(dgwsHeader)) 
    var response = client.GetMedicineCard_2015_06_01Async(
        Security: null, // Security og header er sat til'null', da de er  OutgoingMessageHeaders ovenover. Se  Security: SecurityHeaderUtil.MakeSecurityUsingDgwsTypes(idc), 
        Header: requestHeader,afsnittet 'Fejlfinding' under 'Invalid ID-kort ved kald til service'
        Header: null, // dgwsHeader kan formentlig godt gives her i stedet for OutgoingMessageHeaders 
        WhitelistingHeader: makeWhitelistingHeader,
        GetMedicineCardRequest: new GetMedicineCardRequestType
        {
            PersonIdentifier = new PersonIdentifierType { source = "CPR", Value = requestCpr }
        }
	);
}


Token til eksternt system (SBO)

...

Code Block
languagec#
var idCardRequest = SOSIFactory.CreateNewUserIdCard(
    systemName,
    new UserInfo(requestCpr, givenName, surName, email, occupation, role, authorizationcode),
    new CareProvider(careProviderIdFormat, careProviderId, careProviderName),
    AuthenticationLevel.MocesTrustedUser, userName, password, user.Certificate, "alternativeIdentifier");

await LoginToGateway(idCardRequest, certificate);

var binding = new CustomBinding();
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11WSAddressingAugust2004, Encoding.UTF8));
binding.Elements.Add(new HttpTransportBindingElement());  

var client = new Fmk.MedicineCardPortTypeClient(     	
	binding, // MedicineCardPortTypeClient.EndpointConfiguration.MedicineCardPort kan evt. bruges i stedet for CustomBinding
    new EndpointAddress(new Uri("http://test2.ekstern-test.nspop.dk:8080/sosigw/proxy/soap-request")));
client.Endpoint.EndpointBehaviors.Add((
    new ViaBehavior(new Uri("https://test2.fmk.netic.dk/fmk12/ws/MedicineCard")));

 using (new OperationContextScope(client.InnerChannel))
{
    OperationContext.Current.OutgoingMessageHeaders.Add(IdCardHeader(idCardRequest)); // Samme ID-kort der blev gemt i SOSI-GW
    new ViaBehavior(new Uri("https://test2.fmk.netic.dk/fmk12/ws/MedicineCard")));

varOperationContext.Current.OutgoingMessageHeaders.Add(XmlHeader(dgwsHeader));
    var response = await client.GetMedicineCard_2015_06_01Async(
    Security: new SecurityHeaderType()null,
    Header: requestHeadernull,
    WhitelistingHeader: whitelistingHeader,
    GetMedicineCardRequest: new GetMedicineCardRequestType
    {
        PersonIdentifier = new PersonIdentifierType
        {
            source = "CPR",
            Value = requestCpr
        }
    });
}

Der henvises til dokumentation af SOSI Gateway for yderligere detaljer.

...

Code Block
languagec#
var callingSystem = new CallingSystem(
    systemName: "Seal.Net.Fmk.Demo",
    careProviderId: "30808460",
    careProviderName: "TRIFORK SERVICES A/S",
    careProviderIdFormat:
    dk.nsi.seal.dgwstypes.SubjectIdentifierType.medcomcvrnumber,
    certificate: new X509Certificate2("Resources/certificates/Statens_Serum_Institut_FOCES.p12", "Test1234"));
var user = new User(
    cpr: "1802602810",
    givenName: "Stine",
    surName: "Svendsen",
    email: "stineSvendsen@example.com",
    role: "læge",
    authCode: "ZXCVB",
    occupation: "Overlæge",
    certificate:
    new X509Certificate2("Resources/certificates/MOCES_cpr_gyldig.p12", "Test1234"));
ICredentialVault userVault = <Create vault>;

var assertion = new OioSamlAssertion(nemidAssertion); // nemidAssertion expected to have been generated at an earlier login.   var domBuilder = OIOSAMLFactory.CreateOiosamlAssertionToIdCardRequestDomBuilder();
domBuilder.SigningVault = userVault;
domBuilder.OioSamlAssertion = assertion;
domBuilder.ItSystemName = system.SystemName;
domBuilder.UserAuthorizationCode = user.AuthCode;
domBuilder.UserEducationCode = null;
domBuilder.UserGivenName = user.GivenName;
domBuilder.UserSurName = user.SurName;
var requestDoc = domBuilder.Build();

var request = OIOSAMLFactory.CreateOioSamlAssertionToIdCardRequestModelBuilder().Build(requestDoc);
var idCard = SealUtilities.SignIn(request, "http://test2.ekstern-test.nspop.dk:8080/sts/services/OIOSaml2Sosi");

var client = new MedicineCardPortTypeClient(<FMK configuration>);
using (new OperationContextScope(client.InnerChannel))
{
    OperationContext.Current.OutgoingMessageHeaders.Add(IdCardHeader(idCard));
    OperationContext.Current.OutgoingMessageHeaders.Add(XmlHeader(MakeHeader())); 
    var response = client.GetMedicineCard_2015_06_01Async(
            Security: SecurityHeaderUtil.MakeSecurityUsingDgwsTypes(idCard)null,
            Header: MakeHeader()null,
            WhitelistingHeader: MakeWhitelistingHeader(),
            GetMedicineCardRequest: new GetMedicineCardRequestType
            {
                PersonIdentifier = new PersonIdentifierType
                {
                    source = "CPR",
                    Value = "2603558084"
                }
            }
        );
}

static Header MakeHeader() =>
    new()
    {
        SecurityLevel = 3,
        TimeOut = TimeOut.Item1440,
        TimeOutSpecified = true,
        Linking = new Linking
        {
            FlowID = Guid.NewGuid().ToString("D"),
            MessageID = Guid.NewGuid().ToString("D")
        },
        FlowStatus = FlowStatus.flow_running,
        FlowStatusSpecified = true,
        Priority = Priority.RUTINE,
        RequireNonRepudiationReceipt = RequireNonRepudiationReceipt.yes
    };  

// Trinene ved brugen af OioSamlFactory til at udveksle en Nemid assertion med FMK:
// 1. Generer bruger- og systeminformation for nem tilgængelighed.
// 2. Opret ny CredentialVault med bruger certifikat.
// 3. Opret en ny Saml2Assertion ud fra informationerne.
// 4. Opret OioSamlAssertion ud fra NemidAssertion
// 5. Opret ny OioSamlFactory
// 6. Opret ny OiosamlAssertionToIdCardRequestDomBuilder og initialiser med korrekte informationer.
// 7. Byg dokumentet
// 8. Opret OioSamlAssertionToIdCardRequestModelBuilder og byg requesten.Brug Sealutilities.Signin til at
//    sende requesten til serveren.Returnerer nyt IdCard signed fra STS
// 9. Opret ny klient til FMK kommunikation
// 10. Kald FMK.

...