If you want to use CardSpace from a WCF client without hard-coding config or using an App.config file then try using the MetadataResolver class. Here is some code that works with .NET Framework 3.0 Beta 2 ("WinFX"):
I've been meaning to get a MetadataResolver example working for a while and I was finally able to spend some time today with it. Not too difficult although it's due to change a little bit with the June CTP. The revocation check was necessary to get around my certificate CRL being unavailable.
using System;using System.ServiceModel;using System.ServiceModel.Channels;using System.ServiceModel.Description;using System.IdentityModel.Selectors;
namespace HelloClient{ class Program { static void Main(string[] args) { try { Uri mexUri = new Uri("http://localhost:4123/helloService/mex"); EndpointAddress mexEndpointAddress = new EndpointAddress(mexUri); ServiceEndpointCollection endpoints = MetadataResolver.Resolve(mexEndpointAddress);
ContractDescription contract = ContractDescription.GetContract(typeof(HelloService.IHello));
foreach (ServiceEndpoint endpoint in endpoints) { if (endpoint.Contract.Namespace.Equals(contract.Namespace) && endpoint.Contract.Name.Equals(contract.Name)) { ChannelFactory<HelloService.IHello> cf = new ChannelFactory<HelloService.IHello>(endpoint.Binding, endpoint.Address);
InfoCardClientCredentials credentials = new InfoCardClientCredentials(); credentials.ServiceCertificate.Authentication.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck; cf.Endpoint.Behaviors.Add(credentials); HelloService.IHello chn = cf.CreateChannel(); Console.WriteLine(chn.Say()); cf.Close();
} } } catch (UserCancellationException) { Console.WriteLine("User cancelled"); } catch (UntrustedRecipientException) { Console.WriteLine("User does not trust the recipient"); } catch (ServiceNotStartedException) { Console.WriteLine("CardSpace service not started"); } catch (InfoCardException ice) { Console.WriteLine("Generic CardSpace exception :" + ice.Message); } catch (Exception e) { Console.WriteLine("Other exceptions :" + e.Message); } finally { Console.WriteLine("Press any key to finish"); Console.ReadKey();
}
} }}