Loading…
Tilbage

Profilbillede

Fra NemLog-in bootstrapToken til kommunikation med FMK

Jesper Hermansen

Jeg forsøger at bytte et bootstrapToken fra NemLog-in til et IdCard, så jeg kan kommunikere med FMK. NemLog-in er et Medarbejderlogin.

For at få et IdCard til kommunikation med FMK, har jeg forsøgt følgende tre muligheder:

Brug af OIO3BSTSAMLAssertionToIDCardRequestDOMBuilder og OIO3BSTSAMLAssertionBuilder

var xmlToken = Encoding.UTF8.GetString(Convert.FromBase64String(rawBootstrapToken));
OIOSAMLFactory factory = new OIOSAMLFactory();
var domBuilder = factory.CreateOIO3BSTSAMLAssertionToIDCardRequestDOMBuilder();
// ... set domBuilder properties ...
var assertionBuilder = factory.CreateOIO3BSTSAMLAssertionBuilder();
// ... set builder properties ...
domBuilder.SetOIOSAMLAssertion(assertionBuilder);
var requestDoc = domBuilder.Build();
var assertionToIdCardRequest = factory.CreateOIOBSTSAMLAssertionToIDCardRequestModelBuilder().Build(requestDoc);
return SealUtilities.SignIn(assertionToIdCardRequest, "https://test1.ekstern-test.nspop.dk:8443/sts/services/BST2SOSI");

Men ovenstående giver ikke mulighed for at indlejre bootstrapToken, da assertionBuilder kun består af simple properties, og domBuilder kun giver mulighed for at sætte en AssertionBuilder via SetOIOSAMLAssertion.

 

Oprettelse af UserIdCard

// factory er en SOSIFactory
UserIdCard userIdCard = factory.CreateNewUserIdCard(itSystemName, CreateUserInfo(), CreateCareProvider(), AuthenticationLevel.VocesTrustedSystem, "", "", systemCertificate, "");
userIdCard.Xassertion = XElement.Parse(xmlToken);
userIdCard.Sign<Assertion>(fact.SignatureProvider);
var idCard = SealUtilities.SignIn(userIdCard, idCardIssuer, "https://test1.ekstern-test.nspop.dk:8443/sts/services/BST2SOSI");
idCard.ValidateSignatureAndTrust(fact.Federation);
return idCard;

Men ovenstående giver fejlen System.ServiceModel.FaultException: 'The specified request failed: relatesTo is mandatory - but was null.' ved SealUtilities.SignIn(...)

 

Via OIOIDWS

Endeligt har jeg forsøgt at konvertere mit bootstrapToken til et System.IdentityModel.Tokens.SecurityToken, og få det signeret af STS med Digst.OioIdws.OioWsTrust.StsTokenService.GetTokenWithBootstrapToken(...)

var config = new StsTokenServiceConfiguration
{
    CacheClockSkew = TimeSpan.FromSeconds(60),
    ClientCertificate = certificate,
    StsCertificate = stsCertificate,
    SendTimeout = TimeSpan.FromSeconds(60),
    StsEndpointAddress = "https://test1.ekstern-test.nspop.dk:8443/sts/services/BST2SOSI",
    TokenLifeTimeInMinutes = 8 * 60,
    WspEndpointId = "https://fmk"
};
var service = new StsTokenServiceCache(config);
return service.GetTokenWithBootstrapToken(token);

Ovenståender giver en NullReferenceException med stacktrace:

Server stack trace: 
   ved Digst.OioIdws.OioWsTrust.ProtocolChannel.OioWsTrustMessageTransformer.ModifyMessageAccordingToWsTrust(Message& response)
   ved Digst.OioIdws.OioWsTrust.ProtocolChannel.OioWsTrustChannel.Request(Message message, TimeSpan timeout)
   ved System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   ved System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   ved System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   ved System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   ved System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   ved System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   ved System.ServiceModel.Security.IWSTrustContract.Issue(Message message)
   ved System.ServiceModel.Security.WSTrustChannel.Issue(RequestSecurityToken rst, RequestSecurityTokenResponse& rstr)
   ved System.ServiceModel.Security.WSTrustChannel.Issue(RequestSecurityToken rst)
   ved Digst.OioIdws.OioWsTrust.StsTokenService.GetToken(StsAuthenticationCase stsAuthenticationCase, SecurityToken authenticationToken)
   ved Digst.OioIdws.OioWsTrust.StsTokenServiceCache.GetToken(StsAuthenticationCase stsAuthenticationCase, SecurityToken authenticationToken)

Samtidig tænker jeg egentlig at kommunikation skal ske via DGWS frem for OIOIDWS.

Hvordan gør man?

Hej Jesper

Det er NSP-supporten der står for support af Seal.NET biblioteket.

Du kan få hjæp til ovenstående via https://www.nspop.dk/category/sup. 

Hej Christian

Tak for svar. Hej prøver hos NSP.