Page History
NSI |
Seal.Net |
Version 2.0 |
|
Ivan Overgaard |
11/29/2012 |
|
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
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 | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
...
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 | ||||
|---|---|---|---|---|
|
<appSettings>
<add key="CheckCrl" value="false"/>
</appSettings>
CheckCrl er per default False.
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
...
| Anchor | ||||
|---|---|---|---|---|
|
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 | ||||
|---|---|---|---|---|
|
...
new GetMedicineCardRequest_2015_06_01
{
Security = SecurityHeaderUtil.MakeSecurityUsingDgwsTypes(idCardRequest),
Header = MakeHeader(),
WhitelistingHeader = MakeWhitelistingHeader(),
GetMedicineCardRequest = new GetMedicineCardRequestType
{
PersonIdentifier = new PersonIdentifierType
{
source = "CPR",
Value = "1802602810"
}
}
});
- Der oprettes en instans af FMK klientklassen der benytter den navngivne konfiguration.
- Der initieres en instans SOSIFactory til at generere et IdCard
- Et UserIdCard genereres vha. factory'en.
- Id-kortet signeres.
- 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
}
}
});
- Der initieres et signeret IdCard vha. en SOSIFactory ud fra user og callingSystem
- STS kaldes med kortet. Der returneres et nyt IdCard underskrevet af STS
- Der oprettes en instans af Service proxy klientklassen, i dette tilfælde FMK.
- 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 | ||||
|---|---|---|---|---|
|
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 | ||||
|---|---|---|---|---|
|
...
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 | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
...
var idCardRequest = factory.CreateNewUserIdCard(system.SystemName, userInfo, new CareProvider(system.CareProviderIdFormat, system.CareProviderId, system.CareProviderName), AuthenticationLevel.MocesTrustedUser, "", "", user.Certificate, "");
- 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 | ||||
|---|---|---|---|---|
|
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 | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
...
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"));
- 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.
- Generer bruger og system information for nem tilgængelighed.
- Opret ny CredentialVault med bruger certifikat.
- Opret en ny Saml2Assertion ud fra informationerne.
- Opret OioSamlAssertion ud fra NemidAssertion
- Opret ny OioSamlFactory
- Opret ny OiosamlAssertionToIdCardRequestDomBuilder og initialiser med korrekte informationer.
- Byg dokumentet
- Opret OioSamlAssertionToIdCardRequestModelBuilder og byg requesten.
- Brug Sealutilities.Signin til at sende requesten til serveren. Returnerer nyt IdCard signed fra STS
- Opret ny klient til FMK kommunikation
- 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 | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
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 | ||||
|---|---|---|---|---|
|
...
| Anchor | ||||
|---|---|---|---|---|
|
| Anchor | ||||
|---|---|---|---|---|
|
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> |










