Versions Compared

Key

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

...

  • app.config er erstattet af appsettings.json og bruges kun til at sætte enkelte parametre:

    Code Block
    languagejs
    {
        "CheckTrust": true,
        "CheckDate": true,
        "CheckCrl": false,
        "sosi:dgws.version": "1.0.1",
        "sosi:issuer": "TheSOSILibrary",
        "credentialVault:alias": "SOSI:ALIAS_SYSTEM"
    }

    Værdierne her er også default-værdierne, hvis en parameter eller hele appsettings-filen udelades.


    Førhen var der ikke overensstemmelse mellem hvad standardværdierne var angivet til i dokumentationen og i koden. 
    Koden er ændret, så den nu stemmer overens med dokumentationen.

    Generelt for .NET Standard og WCF gælder det, at det der før blev konfigureret i app.config, nu konfigureret i kode.

    Her er et eksempel på en klient, NtsWSProviderClient, der er generet ud fra en WCF service reference, som konfigureres i kode, frem for gennem app.config:

    Code Block
    languagec#
    var binding = new CustomBinding();
    binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11WSAddressingAugust2004, Encoding.UTF8));
    binding.Elements.Add(new HttpTransportBindingElement());
    
    var client = new NSTWsProvider.NtsWSProviderClient(binding, new EndpointAddress("https://test1-cnsp.ekstern-test.nspop.dk:8443/nts/service"));
    
    client.Endpoint.EndpointBehaviors.Add(new SealEndpointBehavior());
    client.Endpoint.EndpointBehaviors.Add(new ViaBehavior(new Uri("http://test1.ekstern-test.nspop.dk:8080/sosigw/proxy/soap-request")));
    
    var dgwsHeader = new Header()
    {
        SecurityLevel = 4,
        SecurityLevelSpecified = true,
        Linking = new Linking { MessageID = Guid.NewGuid().ToString("D") }
    };
    
    using (new OperationContextScope(client.InnerChannel))
    {
        // Adding seal-security and dgws-header soap header
        OperationContext.Current.OutgoingMessageHeaders.Add(new IdCardMessageHeader(sealCard));
        OperationContext.Current.OutgoingMessageHeaders.Add(HeaderFromXmlXmlHeader(dgwsHeader));
         // Throws Exception if not succesful. 
        return client.invokeAsync("test");
    }
  • Der er tilfælde hvor man måske ønsker at konfigurere en clientVia endpointbehavior på en Web Service Reference som man har tilføjet.
    Det blev før gjort i app.config, men da denne ikke længere findes, er der lavet en endpointbehavior klasse som hedder 'ViaBehavior'.
    Den bruges som alle andre IEndPointBehavior-klasser:

    Code Block
    languagec#
    client.Endpoint.EndpointBehaviors.Add(new ViaBehavior(new Uri("<via URI>")));
  • 5.0.0 kræver ikke nær så meget konfiguration som ældre Seal.NET versioner, da meget konfiguration nu håndteres internt af biblioteket.
    Det medfører desuden, at det nu fremgår af metode-signaturen for Sosi2SamlStsClient og Saml2SosiStsClient, hvis man skal tage stilling til en konfiguration.

  • AbstractCrendentialVault, GenericCertStoreCredentialVault og GenericCredentialVault er fjernet.

    Man kan enten give certifikatet direkte til metoder som skal bruge et certifikat, eller læse det ind fra et certificate store med:

    Code Block
    languagec#
    new dk.nsi.seal.Vault.ThumbprintCertStoreCredentialVault(certThumbprint).GetSystemCredentials();

    Internt bruger ThumbprintCertStoreCredentialVault X509Store klassen til at loade et certifikatet fra et certificate store.

    Man kan også implementere sin egen klasse til det, ved at arve fra dk.nsi.seal.Vault.ICredentialVault.

    Essentielt er ICredentialVault bare en måde at give et certifikat til en metode, og alle metoder der bruger den, kunne ændres så de tager et X509Certificate2 i stedet. Så ville man selv kunne bestemme hvordan man vil indlæse certifikater, i stedet for at Seal.NET dikterer at man skal bruge ICredentialVault. Denne ændring er dog ikke en del af scope for '5.0.0'.

  • SealCard er fjernet, og fuldt erstattet af IdCard.
  • DgwsHeader er fjernet, og DgwsMessageHeader er omdøbt til XmlMessageHeader, da den ikke gør noget DGWS specifikt, men tager noget XML og indsætter det som Header content, når den tilføjes til WCF OutgoingMessageHeaders.

    Den laves nu med en static metode 'XmlMessageHeader.HeaderFromXmlXmlHeader', som direkte tager den værdi der før blev givet til DgwsHeader constructor. Se XmlessageHeader XmlMessageHeader.

  • IdCardMessageHeader laves nu med en static constructor IdCardMessageHeader.IdCardHeader.
  • SealSigningEndpointBehavior tager nu ClientCredentials direkte i constructor, i stedet for at den specificeres gennem app.config og gives til SealSigningEndpointBehavior gennem AddBindingParameters.
  • Create-metoder i SOSIFactory create metoder er nu static.
  • ICredentialVault-argument er fjernet fra 'SignatureUtil.Validate', da den ikke blev brugt til noget.
  • SosiFactory.GetCredentialVault er omdøbt til GetCertificate, og returner nu X509Certificate2. 

...

  • Seal2SamlStsClient er omdøbt til Sosi2SamlStsClient.
  • SosiGwCardClient er fjernet, da Sosi2SamlStsClient opfylder samme rolle.
  • Metoderne 'ExchangeAssertion' og 'ExchangeAssertionViaGW' i Sosi2SamlStsClient er slået sammen til én static metode der hedder 'ExchangeAssertion':
    I det gamle Seal.NET bliver denne kode:

    Code Block
    languagec#
    var assertion = IdCard.GetAssertion<Assertion>();
    using (var stsClient = new Seal2SamlStsClient("Seal2EncSamlViaGW"))
    using (new OperationContextScope((IContextChannel)stsClient.Channel.Channel))
    {
        var sealCardCallingGw = SealCard.Create(assertion);
        OperationContext.Current.OutgoingMessageHeaders.Add(new SealCardMessageHeaderIdCardMessageHeader(sealCardCallingGwIdCard));
        var oioToken = stsClient.ExchangeAssertionViaGW("http://sosi.dk") as GenericXmlSecurityToken;
    }

    Til

    Code Block
    languagec#
    Sosi2SamlStsClient.ExchangeAssertion(clientCertificate, "<audience>", uri, idCard).XAssertion;

    Den findes også i en udgave der ikke tager et clientCertificate.

    Metoderne er slået sammen fordi de alle udførte det samme, men gjorde det på forskellig vis:

    'ExchangeAssertion' tog en assertion direkte i parameterlisten, mens 'ExchangeAssertionViaGW' ikke tog den direkte i parameterlisten,
    men i stedet blev assertion sat ind i 'OperationContext.Current.OutgoingMessageHeaders' inden 'ExchangeAssertionViaGW' blev kaldt - det er dette scenarie der er vist her, i den gamle Seal.NET kode.

...

Rent lavpraktisk betyder det at MessageHeaders kan gives til 'OutgoingMessageHeaders.Add', og så bliver den data MessageHeaderen har, sat ind i headeren på det request man laver.

...

Benyttes til at tilføje et ID kort til headeren af et WCF request, ved at sætte den på OutgoingMessageHeaders..

Laves med en static constructor IdCardMessageHeader.IdCardHeader

Eksempel:

Code Block
languagec#
using static dk.nsi.seal.MessageHeaders.IdCardMessageHeader;

var client = new NtsWSProviderClient(new BasicHttpsBinding(), new EndpointAddress("https://test1-cnsp.ekstern-test.nspop.dk:8443/nts/service"));

using (new OperationContextScope(client.InnerChannel))
{
    OperationContext.Current.OutgoingMessageHeaders.Add(new IdCardMessageHeaderIdCardHeader(idCard)); // Tilføj ID Kort med IdCardMessageHeader 
    return client.invokeAsync("test");
}

...

XmlMessageHeader indeholder en static constructor-metode, HeaderFromXmlXmlHeader, til at lave instanser af den.

Eksempel på HeaderFromXmlXmlHeader:

Code Block
languagec#
using static dk.nsi.seal.MessageHeaders.XmlMessageHeader;

...

reply.Headers.Add(HeaderFromXmlXmlHeader(header));

Mere komplet eksempel hvor dk.nsi.seal.dgwstypes.Header serialiseres til XML og indsættes:

Code Block
languagec#
var client = new NSTWsProvider.NtsWSProviderClient(binding, new EndpointAddress("https://test1-cnsp.ekstern-test.nspop.dk:8443/nts/service"));

var dgwsHeader = new dk.nsi.seal.dgwstypes.Header()
{
    SecurityLevel = 4,
    SecurityLevelSpecified = true,
    Linking = new Linking { MessageID = Guid.NewGuid().ToString("D") }
};

using (new OperationContextScope(client.InnerChannel))
{
    OperationContext.Current.OutgoingMessageHeaders.Add(HeaderFromXmlXmlHeader(dgwsHeader)); // Indsæt header som XML, ud fra serialiseret header
    return client.invokeAsync("test");
}

...