Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

NSI

Seal.Net

Version 2.0

 

Ivan Overgaard

11/29/2012

 

Anchor
_Toc242247440
_Toc242247440
Anchor
_Toc342300584
_Toc342300584
Anchor
_Toc487881346
_Toc487881346
Revisionshistorik:

Version

Dato

Ændring

Ansvarlig

0.8

29-11-2012

Oprettet

IO

1.0

04-04-2013

redigeret

IO

3.0.0

03-01-2017

Fjernet .net 3.5 referancer

FMO

4.0.0

26-06-2017

Tilføjet IdCards og OioSamlFactory

KRO og SKS



Indhold
Revisionshistorik:
Indledning
Historik
Systemkrav
Leverancer
Seal.Net Api'et
Designvalg
Ordforklaringer
Objekter
Brug af Seal.Net Api
Klienteksempler
Direkte kald
Føderalt
Brug af NemId:
Secure browser logon
SOSI Gateway
SOSI Gateway SBO
Eksempler ved brug af OioSamlFactory
Brug af NemId:
Eksempler på generering af objekter fra proxy
CallingSystem og User
Security
Header
Make NemId Assertion
Referencer

Anchor
_Toc242247441
_Toc242247441
Anchor
_Toc342300585
_Toc342300585
Anchor
_Toc487881347
_Toc487881347
Indledning

...


Seal2SalmStsClient koverterer en SealAssertion til en Saml2Assertion enten via direkte kald til sts eller via SOSI Gateway.

Kort


SealCard indpakker svaret fra en STS (assertion) og giver mulighed for benytte data i fremtidige kald. SealCard er deprecated og brugen af IdCards (nederst) er derfor at foretrække.
DgwsHeader indpakker tilsvarende Medcom-header data

Nye kort er bleven tilføjet som er IdCards. IdCard er en abstract klasse så man bruger enten et SystemIdCard eller UserIdCard. System eller UseridCard bruges hhv. for at representere et system eller en bruger.

...


SealCardMessageHeader benyttes til at udstille et SealCard som en WCF MessageHeader
DgwsMessageHeader udstiller tilsvarende et DgwsHeader som en WCF MeassageHeader.

Endpointbehaviors


SealSigningEndpointBehavior tilpasser request XML header med manglende attributter og underskriver request v.h.a. et associeret certifikat i clientCredentials. Yderligere valideres underskriften af response.
SealEndpointBehavior implementerer DGWS.

Factories


SosiFactory kan generere nye IdCards.
OioSamlFactory kan generere nye Requests. Normalt laver man en DOM builder som genererer selve XML'en og bagefter en ModelBuilder for at lave selve Requesten. Requesten kan så blive sendt ved hjælp af SealUtilities SignIn funktion.

DomBuilders


Dombuilders er et hierarki, som bliver brugt til at generere XML kode. Til venstre er der 3 klasser der håndterer bygning af selve assertions, mens det højre klasse hierarki bliver brugt til at generere selve Soap beskeden uden Assertion.

Requests


Requests er selve modeller over XML'en. De har diverse convenience methods til at hente informationer direkte ud fra XML'en.

Vaults

Vi har implementeret et generelt vault system som bliver brugt til at gemme certifikater i. GenericCredentialVault bruger en standart .Net CertificateStore til at gemme certifikater i. Der kan laves nye CredentialVaults som kan bruges i SosiFactory og andre steder i Seal.Net ved at nedarve fra ICredentialVault.

Federation

Federations bliver brugt når man skal validere certfikatet fra den service man snakker med. SosiFederation neders vil validere servicens certifikat op mod OCES2 root certifikatet for at sikre, at servicen er authoriseret. SosiTestFederation vil validere op mod OCES2 test root certifikat. Hvis ingen Federation bliver brugt, skal root certifikatet af den pågældende services certifikat (eller selve certifikatet) ligge i den brugte CredentialVault.

Hjælpefunktioner


Indeholder forskellige funktioner f.eks. til at signere og validere en signatur. Derudover kan man sende requests fra OioSamlFactory afsted uden brug af clienter.


...

I dette afsnit beskrives overordnet hvordan Seal.Net benyttes til at opbygge en klient eller en service applikation.

Konfiguration

Der er to måder at konfigurere certifikat validering på i Seal.Net. Begge kan aktiveres/deaktiveres i App.config eller Web.config.

CheckTrust

CheckTrust specificerer om certifikatet skal valideres op mod et root certifikat og om chainen skal valideres. Hvis en federation er specificeret så er det valideringen mod den federation som bliver aktiveret-deaktiveret. Skal slås fra ved self signed certifikater.
<appSettings>
<add key="CheckTrust" value="false"/>
</appSettings>
CheckTrust er per default True.

CheckCrl

CheckCrl specificerer om certifikatet skal checkes op mod en Certificate Revocation List. Skal slås fra ved self signed certifikater.

Anchor
_GoBack
_GoBack

<appSettings>
<add key="CheckCrl" value="false"/>
</appSettings>
CheckCrl er per default False.

Anchor
_Toc242247455
_Toc242247455
Anchor
_Toc342300594
_Toc342300594
Anchor
_Toc487881356
_Toc487881356
Klienteksempler

...

Anchor
_Toc342300595
_Toc342300595
Til efterfølgende eksempler benyttes nogle metoder til at oprette instanser af datatyper.
MakeHeader og MakeSecurity.
Disse metoder opretter instanser af de før nævnte klasser; Security og Header.
Der benyttes desuden variablerne callingSystem og user, som kan ses under " eksempler på generering af proxyklasser".
Eksemplerne viser et kald til en FKM webservice. Metodekaldet er GetMedicineCard_2015_06_01

Anchor
_Toc487881357
_Toc487881357
Direkte kald

...

new GetMedicineCardRequest_2015_06_01
{
Security = SecurityHeaderUtil.MakeSecurityUsingDgwsTypes(idCardRequest),
Header = MakeHeader(),
WhitelistingHeader = MakeWhitelistingHeader(),
GetMedicineCardRequest = new GetMedicineCardRequestType
{
PersonIdentifier = new PersonIdentifierType
{
source = "CPR",
Value = "1802602810"
}
}
});

  1. Der oprettes en instans af FMK klientklassen der benytter den navngivne konfiguration.
  2. Der initieres en instans SOSIFactory til at generere et IdCard
  3. Et UserIdCard genereres vha. factory'en.
  4. Id-kortet signeres.
  5. Servicen kaldes.

...

new GetMedicineCardRequest_2015_06_01
{
Security = SecurityHeaderUtil.MakeSecurityUsingDgwsTypes(idc),
Header = requestHeader,
WhitelistingHeader = makeWhitelistingHeader,
GetMedicineCardRequest = new GetMedicineCardRequestType
{
PersonIdentifier = new PersonIdentifierType
{
source = "CPR",
Value = requestCpr
}
}
});

  1. Der initieres et signeret IdCard vha. en SOSIFactory ud fra user og callingSystem
  2. STS kaldes med kortet. Der returneres et nyt IdCard underskrevet af STS
  3. Der oprettes en instans af Service proxy klientklassen, i dette tilfælde FMK.
  4. Der oprettes et Security element der indeholder den Assertion der er underskrevet af STS, samt et MedcomHeader element. Herefter kaldes Servicen.

Konfigurationen er det samme som ved Direkte kald i forrige afsnit.

Anchor
_Toc342300597
_Toc342300597
<endpoint
address="https://test2.fmk.netic.dk/fmk12/ws/MedicineCard"
behaviorConfiguration="sealbehavior"
binding="basicHttpBinding"
bindingConfiguration="MedicineCardBinding"
contract="MedicinCard.MedicineCardPortType"
name="MedicineCardPort"
/>
<basicHttpBinding>
<binding name="MedicineCardBinding">
<security mode="Transport"/>
</binding>
</basicHttpBinding>
<behavior name="sealbehavior" >
<sbhe/>
</behavior>
<behaviorExtensions>
<add name="sbhe" type="dk.nsi.seal.SealBehaviorExtentionElement, Seal" />
</behaviorExtensions>

Anchor
_Toc487881360
_Toc487881360
Secure browser logon

...


1. Et IdCard oprettes fra SOSIFactory.
2. Et nyt IdCard oprettes underskrevet af STS.
3. En proxy til STS der veksler IdCard oprettes.
4. ClientCredentials sættes.
5. STS til konvertering af assertion kaldes.
6. Det genererede krypterede kort hentes som XML.
Konfiguration:
<endpoint address="http://test1.ekstern-test.nspop.dk:8080/sts/services/Sosi2OIOSaml"
binding="customBinding"
bindingConfiguration="Soap11Http"
behaviorConfiguration="SealSigning"
contract="System.ServiceModel.Security.IWSTrustChannelContract"
name="Seal2EncSaml" />

<customBinding>
<binding name="Soap11Http">
<textMessageEncoding messageVersion="Soap11WSAddressing10" writeEncoding="utf-8" />
<httpTransport />
</binding>
</customBinding>
<behavior name="SealSigning">
<SealSigningBE/>
</behavior>
<behaviorExtensions>
<add name="SealSigningBE" type="dk.nsi.seal.SealSigningBehaviorExtentionElement, Seal"/>
</behaviorExtensions>

Anchor
_Toc342300598
_Toc342300598
Anchor
_Toc487881361
_Toc487881361
SOSI Gateway

...


var idCardRequest = factory.CreateNewUserIdCard(system.SystemName, userInfo, new CareProvider(system.CareProviderIdFormat, system.CareProviderId, system.CareProviderName), AuthenticationLevel.MocesTrustedUser, "", "", user.Certificate, "");

  1. LoginToGateway(idCardRequest, global.NsiLge1);

...


1. Opretter en SosiFactory og IdCardRequest
2. Kalder LoginToGateway som har inline kommentar
3. FMK klient oprettes.
4. Service kaldes
Konfiguration:
SOSIGW
<endpoint address="http://test2.ekstern-test.nspop.dk:8080/sosigw/service/sosigw"
binding="basicHttpBinding"
contract="SosiGwService.SosiGWFacade"
name="SosiGWSoapBinding"/>
FMK
<endpoint address="https://test2.fmk.netic.dk/fmk12/ws/MedicineCard"
behaviorConfiguration="AddressingBehavior"
binding="customBinding"
bindingConfiguration="Soap11Http"
contract="MedicinCard.MedicineCardPortType"
name="SosiGWFMK"/>
<customBinding>
<binding name="Soap11Http">
<textMessageEncoding messageVersion="Soap11WSAddressing10" writeEncoding="utf-8" />
<httpTransport />
</binding>
</customBinding>

<behavior name="AddressingBehavior">
<clientVia viaUri="http://test2.ekstern-test.nspop.dk:8080/sosigw/proxy/soap-request"/>
</behavior>

Anchor
_Toc487881362
_Toc487881362
SOSI Gateway SBO

En token til SBO kan hentes fra SOSI Gateway på nedenstående måde. Det forudsættes at der er logget på SOSI Gateway og dermed er assertion initieret.
Endpoint refererer til STS og ClientVia refererer til SOSI Gateway.
using (var stsClient = new Seal2SamlStsClient("GWFetchCard"))
using (var scope = new OperationContextScope((IContextChannel)stsClient.Channel.Channel))
{
var factory = CreateFactory();
OperationContext.Current.OutgoingMessageHeaders.Add(new IdCardMessageHeader( factory.DeserializeIdCard(assertion)));
var d = stsClient.ExchangeAssertionViaGW( "http://sundhed.dk/") as GenericXmlSecurityToken;
var elm = d.TokenXml;
}
Konfiguration:
<endpoint address="http://test1.ekstern-test.nspop.dk:8080/sts/services/Sosi2OIOSaml"
binding="customBinding"
behaviorConfiguration="AddressingBehavior"
bindingConfiguration="Soap11Http"
contract="System.ServiceModel.Security.IWSTrustChannelContract"
name="GWFetchCard" />
<customBinding>
<binding name="Soap11Http">
<textMessageEncoding messageVersion="Soap11WSAddressing10" writeEncoding="utf-8" />
<httpTransport />
</binding>
</customBinding>
<behavior name="AddressingBehavior">
<clientVia viaUri="http://test2.ekstern-test.nspop.dk:8080/sosigw/proxy/soap-request"/>
</behavior>

Anchor
_Toc487881363
_Toc487881363
Anchor
_Toc342300599
_Toc342300599
Eksempler ved brug af OioSamlFactory

...

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"));

  1. var userVault = new GenericCredentialVault("UserVault");

...

{
var response = client.GetMedicineCard_2015_06_01(
new GetMedicineCardRequest_2015_06_01
{
Security = SecurityHeaderUtil.MakeSecurityUsingDgwsTypes(idCard),
Header = MakeHeader(),
WhitelistingHeader = MakeWhitelistingHeader(),
GetMedicineCardRequest = new GetMedicineCardRequestType
{
PersonIdentifier = new PersonIdentifierType
{
source = "CPR",
Value = "2603558084"
}
}
});
Her kan man se brugen af OioSamlFactory til at udveksle en Nemid assertion med FMK.

  1. Generer bruger og system information 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.
  9. Brug Sealutilities.Signin til at sende requesten til serveren. Returnerer nyt IdCard signed fra STS
  10. Opret ny klient til FMK kommunikation
  11. Kald FMK.

...

Nedenstående eksempel opretter en Security element Timestamp sættes til at være 5 minutter gammel.
static Security MakeSecurity( Assertion assertion)
{
return new Security
{
id = Guid.NewGuid().ToString("D"),
Timestamp = new Timestamp { Created = DateTime.Now - TimeSpan.FromMinutes(5) },
Assertion = assertion
};
}

Anchor
_Toc342300602
_Toc342300602
Anchor
_Toc487881368
_Toc487881368
Header


static Header MakeHeader()
{
return new Header
{
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
};
}


Anchor
_Toc487881369
_Toc487881369
Make NemId Assertion

...

Anchor
_Toc226604653
_Toc226604653
Anchor
_Toc487881370
_Toc487881370
Referencer

Forkortelse i teksten

Henvisning

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="a906cdd8-a856-48fa-b3af-9e69d149de6f"><ac:plain-text-body><![CDATA[

[SAML2.0]

https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=security

]]></ac:plain-text-body></ac:structured-macro>

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="7e8fddac-a1c4-4c1e-893d-d02f891e609d"><ac:plain-text-body><![CDATA[

[OIOSAML]

http://digitaliser.dk/resource/2377872

]]></ac:plain-text-body></ac:structured-macro>

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="923053d9-c34e-46e7-879d-75fa83f9df93"><ac:plain-text-body><![CDATA[

[OIOIDWS]

http://digitaliser.dk/resource/526486

]]></ac:plain-text-body></ac:structured-macro>