示例#1
0
 private void buttonGet_Click(object sender, EventArgs e)
 {
     try
     {
         this.Cursor = Cursors.WaitCursor;
         this.xmlNotepadPanelControl1.XmlNotepadForm.ClearXmlDocument();
         MetadataSet metadata = null;
         if (this.checkBoxAssembly.Checked)
         {
             this.FromAssembly(this.textBoxUrl.Text);
         }
         else
         {
             metadata = MetadataHelper.GetMetadataSet(this.textBoxUrl.Text);
         }
         if (metadata != null)
         {
             StringBuilder sb = new StringBuilder();
             metadata.WriteTo(XmlWriter.Create(sb));
             this.xmlNotepadPanelControl1.XmlNotepadForm.LoadXmlDocument(sb.ToString());
         }
         this.buttonGet.Enabled = false;
     }
     catch (Exception ex)
     {
         MessageBox.Show(MetadataHelper.ErrorMessage(ex), "Loading metadata", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
     finally
     {
         this.Cursor = Cursors.Default;
     }
 }
示例#2
0
        internal static string SaveMetadataToString(MetadataSet metadata)
        {
            using (var ms = new MemoryStream()) {
                var writer = new XmlTextWriter(new StreamWriter(ms));
                writer.Formatting = Formatting.Indented;
                metadata.WriteTo(writer);
                writer.Flush();

                return(Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Position));
            }
        }
示例#3
0
        static void Main(string[] args)
        {
            Uri address = new Uri("http://127.0.0.1:9999/calculatorservice/metadata");
            MetadataExchangeClient metadataExchangeClient = new MetadataExchangeClient(address, MetadataExchangeClientMode.HttpGet);

            metadataExchangeClient.ResolveMetadataReferences = false;
            MetadataSet metadata = metadataExchangeClient.GetMetadata();

            using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8))
            {
                metadata.WriteTo(writer);
            }
            Process.Start("metadata.xml");
        }
示例#4
0
        public static void SaveMetadataToFile(string filename, MetadataSet metadata)
        {
            if (File.Exists(filename))
            {
                return;
            }

            using (var file = new StreamWriter(filename, false)) {
                var writer = new XmlTextWriter(file);
                writer.Formatting = Formatting.Indented;
                metadata.WriteTo(writer);
            }

            Console.WriteLine("Exported {0}.", filename);
        }
示例#5
0
 static void Main(string[] args)
 {
     using (ChannelFactory<IMetadataProvisionService> channelFactory = new ChannelFactory<IMetadataProvisionService>("mex"))
     {
         IMetadataProvisionService proxy = channelFactory.CreateChannel();
         string action = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get";
         Message request = Message.CreateMessage(MessageVersion.Default, action);
         Message reply = proxy.Get(request);
         MetadataSet metadata = reply.GetBody<MetadataSet>();
         using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8))
         {
             metadata.WriteTo(writer);
         }
         Process.Start("metadata.xml");
     }
 }
示例#6
0
        private static void Test1()
        {
            Uri address = new Uri("http://127.0.0.1:9999/calculatorservice/metadata");
            MetadataExchangeClient client = new MetadataExchangeClient(address, MetadataExchangeClientMode.HttpGet);

            client.ResolveMetadataReferences = false;
            MetadataSet metadata = client.GetMetadata();

            using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8))
            {
                metadata.WriteTo(writer);
            }

            WsdlImporter importer = new WsdlImporter(metadata);

            importer.ImportAllEndpoints();
            importer.ImportAllContracts();
        }
示例#7
0
        static void Main(string[] args)
        {
            ContractDescription contract    = ContractDescription.GetContract(typeof(IOrderService));
            EndpointAddress     address1    = new EndpointAddress("http://127.0.0.1/orderservice");
            EndpointAddress     address2    = new EndpointAddress("net.tcp://127.0.0.1/orderservice");
            ServiceEndpoint     endpoint1   = new ServiceEndpoint(contract, new WS2007HttpBinding(), address1);
            ServiceEndpoint     endpoint2   = new ServiceEndpoint(contract, new NetTcpBinding(), address2);
            XmlQualifiedName    serviceName = new XmlQualifiedName("OrderService", "http://www.artech.com/services/");
            WsdlExporter        exporter    = new WsdlExporter();

            exporter.ExportEndpoints(new ServiceEndpoint[] { endpoint1, endpoint2 }, serviceName);
            MetadataSet metadata = exporter.GetGeneratedMetadata();

            using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8))
            {
                metadata.WriteTo(writer);
            }
            Process.Start("metadata.xml");
        }
示例#8
0
        private string SerializeMetadataSetToString(MetadataSet metadataSet)
        {
            if (metadataSet == null)
            {
                throw new ArgumentNullException("metadataSet");
            }

            var stringBuilder = new StringBuilder();

            using (var textWriter = new StringWriter(stringBuilder))
            {
                using (var writer = new XmlTextWriter(textWriter))
                {
                    metadataSet.WriteTo(writer);
                }
            }

            return(stringBuilder.ToString());
        }
示例#9
0
        static void Main(string[] args)
        {
            MetadataSet metadata = null;

            using (ChannelFactory <IMetadataExchange> channelFactory = new ChannelFactory <IMetadataExchange>(MetadataExchangeBindings.CreateMexHttpBinding(), new EndpointAddress("http://127.0.0.1:9999/calculatorservice/mex")))
            {
                IMetadataExchange proxy = channelFactory.CreateChannel();
                using (proxy as IDisposable)
                {
                    string  action  = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get";
                    Message request = Message.CreateMessage(MessageVersion.Default, action);
                    metadata = proxy.Get(request).GetBody <MetadataSet>();
                }
            }
            using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8))
            {
                metadata.WriteTo(writer);
            }
            Process.Start("metadata.xml");
        }
示例#10
0
        static void Main(string[] args)
        {
            //MetadataSection metadataSection = new MetadataSection();
            //MetadataLocation metadataLocation = new MetadataLocation();
            //WsdlExporter wsdlExporter = new WsdlExporter();
            ContractDescription contract         = ContractDescription.GetContract(typeof(IOrderService));
            EndpointAddress     endpointAddress1 = new EndpointAddress("http://127.0.0.1/orderservice");
            EndpointAddress     endpointAddress2 = new EndpointAddress("net.tcp://127.0.0.1/orderservice");
            ServiceEndpoint     endpoint1        = new ServiceEndpoint(contract, new WSHttpBinding(), endpointAddress1);
            ServiceEndpoint     endpoint2        = new ServiceEndpoint(contract, new NetTcpBinding(), endpointAddress2);
            XmlQualifiedName    serviceName      = new XmlQualifiedName("OrderService", "http://www.lhl.com");
            WsdlExporter        wsdlExporter     = new WsdlExporter();

            wsdlExporter.ExportEndpoints(new ServiceEndpoint[] { endpoint1, endpoint2 }, serviceName);
            MetadataSet metadata = wsdlExporter.GetGeneratedMetadata();

            using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8)) {
                metadata.WriteTo(writer);
            }
        }
示例#11
0
        static void Main(string[] args)
        {
            MetadataSet    metadata = new MetadataSet();
            string         address  = "http://127.0.0.1:3721/calculatorservice/metadata";
            HttpWebRequest request  = (HttpWebRequest)WebRequest.Create(address);

            request.Method = "Get";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            using (XmlReader reader = XmlDictionaryReader.CreateTextReader(response.GetResponseStream(), new XmlDictionaryReaderQuotas()))
            {
                System.Web.Services.Description.ServiceDescription serviceDesc = System.Web.Services.Description.ServiceDescription.Read(reader);
                metadata.MetadataSections.Add(MetadataSection.CreateFromServiceDescription(serviceDesc));
            }
            using (XmlWriter writer = new XmlTextWriter("metadata.xml", Encoding.UTF8))
            {
                metadata.WriteTo(writer);
            }
            Process.Start("metadata.xml");
        }
        private XmlDictionaryReader CreateMetadataReader(Uri mexAddress)
        {
            var metadataSet       = new MetadataSet();
            var metadataReference = new MetadataReference(new EndpointAddress(mexAddress), AddressingVersion.WSAddressing10);
            var metadataSection   = new MetadataSection(MetadataSection.MetadataExchangeDialect, null, metadataReference);

            metadataSet.MetadataSections.Add(metadataSection);

            var sb     = new StringBuilder();
            var w      = new StringWriter(sb, CultureInfo.InvariantCulture);
            var writer = XmlWriter.Create(w);

            metadataSet.WriteTo(writer);
            writer.Flush();
            w.Flush();

            var input  = new StringReader(sb.ToString());
            var reader = new XmlTextReader(input);

            return(XmlDictionaryReader.CreateDictionaryReader(reader));
        }
示例#13
0
    /// <summary>
    /// Create a reader to provide simulated Metadata endpoint configuration element
    /// </summary>
    /// <param name="activeSTSUrl">The active endpoint URL.</param>
    static XmlDictionaryReader GetMetadataReader(string activeSTSUrl)
    {
        MetadataSet       metadata    = new MetadataSet();
        MetadataReference mexReferece = new MetadataReference(new EndpointAddress(activeSTSUrl + "/mex"), AddressingVersion.WSAddressing10);
        MetadataSection   refSection  = new MetadataSection(MetadataSection.MetadataExchangeDialect, null, mexReferece);

        metadata.MetadataSections.Add(refSection);

        byte[]        metadataSectionBytes;
        StringBuilder stringBuilder = new StringBuilder();

        using (StringWriter stringWriter = new StringWriter(stringBuilder))
        {
            using (XmlTextWriter textWriter = new XmlTextWriter(stringWriter))
            {
                metadata.WriteTo(textWriter);
                textWriter.Flush();
                stringWriter.Flush();
                metadataSectionBytes = stringWriter.Encoding.GetBytes(stringBuilder.ToString());
            }
        }

        return(XmlDictionaryReader.CreateTextReader(metadataSectionBytes, XmlDictionaryReaderQuotas.Max));
    }
示例#14
0
        private void comboBoxContracts_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (sender is ComboBox && (sender as ComboBox).Tag != null && !string.IsNullOrEmpty(this.comboBoxContracts.Text))
                {
                    Assembly asm = (sender as ComboBox).Tag as Assembly;

                    WsdlExporter exporter = new WsdlExporter();

                    // generate contract from the clr type
                    ContractDescription contract = ContractDescription.GetContract(asm.GetType(this.comboBoxContracts.Text));

                    // dummy endpoint
                    exporter.ExportEndpoint(new ServiceEndpoint(contract, new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost")));

                    // generate metadata
                    MetadataSet set = exporter.GetGeneratedMetadata();
                    if (set != null)
                    {
                        // show in the notepad
                        StringBuilder sb = new StringBuilder();
                        set.WriteTo(XmlWriter.Create(sb));
                        this.xmlNotepadPanelControl1.XmlNotepadForm.LoadXmlDocument(sb.ToString());
                    }
                }
                else
                {
                    this.xmlNotepadPanelControl1.XmlNotepadForm.ClearXmlDocument();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(MetadataHelper.ErrorMessage(ex), "Loading resource", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
示例#15
0
        public void SerializeAndSign(string filename, X509Certificate2 cert)
        {
            MemoryStream stream = new MemoryStream();
            XmlWriter    writer = XmlWriter.Create(stream);

            writer.WriteStartElement(XmlNames.WSIdentity.InfoCardElement, XmlNames.WSIdentity.Namespace);

            //
            // write the InformationCardReference element
            //
            writer.WriteAttributeString(XmlNames.Xml.Language, XmlNames.Xml.Namespace, m_language);
            writer.WriteStartElement(XmlNames.WSIdentity.InfoCardRefElement, XmlNames.WSIdentity.Namespace);
            writer.WriteElementString(XmlNames.WSIdentity.CardIdElement, XmlNames.WSIdentity.Namespace, m_cardId);
            writer.WriteElementString(XmlNames.WSIdentity.CardVersionElement, XmlNames.WSIdentity.Namespace, m_cardVersion);
            writer.WriteEndElement();

            //
            // card name
            //
            if (!String.IsNullOrEmpty(m_cardName))
            {
                writer.WriteStartElement(XmlNames.WSIdentity.CardNameElement, XmlNames.WSIdentity.Namespace);
                writer.WriteString(m_cardName);
                writer.WriteEndElement();
            }


            //
            // card image
            //
            if (null != m_logo && 0 != m_logo.Length)
            {
                writer.WriteStartElement(XmlNames.WSIdentity.CardImageElement, XmlNames.WSIdentity.Namespace);
                if (!String.IsNullOrEmpty(m_mimeType))
                {
                    writer.WriteAttributeString(XmlNames.WSIdentity.MimeTypeAttribute, m_mimeType);
                }
                string val = Convert.ToBase64String(m_logo);
                writer.WriteString(val);
                writer.WriteEndElement();
            }

            //
            // card issuer uri
            //
            writer.WriteStartElement(XmlNames.WSIdentity.IssuerElement, XmlNames.WSIdentity.Namespace);
            writer.WriteString(m_issuerId);
            writer.WriteEndElement();


            //
            // issue time
            //
            writer.WriteStartElement(XmlNames.WSIdentity.TimeIssuedElement, XmlNames.WSIdentity.Namespace);
            writer.WriteString(XmlConvert.ToString(m_issuedOn, XmlDateTimeSerializationMode.Utc));
            writer.WriteEndElement();

            //
            // expiry time
            //
            writer.WriteStartElement(XmlNames.WSIdentity.TimeExpiresElement, XmlNames.WSIdentity.Namespace);
            writer.WriteString(XmlConvert.ToString(m_expiresOn, XmlDateTimeSerializationMode.Utc));
            writer.WriteEndElement();

            //
            // Start the tokenservice list
            //
            writer.WriteStartElement(XmlNames.WSIdentity.TokenServiceListElement, XmlNames.WSIdentity.Namespace);

            EndpointAddressBuilder eprBuilder = new EndpointAddressBuilder();

            eprBuilder.Uri = new Uri(m_issuerId);

            eprBuilder.Identity = new X509CertificateEndpointIdentity(cert);

            if (null != m_mexUri)
            {
                MetadataReference mexRef = new MetadataReference();
                mexRef.Address        = new EndpointAddress(m_mexUri);
                mexRef.AddressVersion = AddressingVersion.WSAddressing10;

                MetadataSection mexSection = new MetadataSection();
                mexSection.Metadata = mexRef;

                MetadataSet mexSet = new MetadataSet();
                mexSet.MetadataSections.Add(mexSection);


                MemoryStream memStream = new MemoryStream();

                XmlTextWriter writer1 = new XmlTextWriter(memStream, System.Text.Encoding.UTF8);

                mexSet.WriteTo(writer1);

                writer1.Flush();

                memStream.Seek(0, SeekOrigin.Begin);

                XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memStream, XmlDictionaryReaderQuotas.Max);

                eprBuilder.SetMetadataReader(reader);
            }

            m_epr = eprBuilder.ToEndpointAddress();



            writer.WriteStartElement(XmlNames.WSIdentity.TokenServiceElement, XmlNames.WSIdentity.Namespace);

            //
            // Write the EndPointReference
            //
            m_epr.WriteTo(AddressingVersion.WSAddressing10, writer);

            //
            // Write the UserCredential Element
            //
            writer.WriteStartElement(XmlNames.WSIdentity.UserCredentialElement, XmlNames.WSIdentity.Namespace);

            //
            // Write the hint
            //
            if (!String.IsNullOrEmpty(m_hint))
            {
                writer.WriteStartElement(XmlNames.WSIdentity.DisplayCredentialHintElement, XmlNames.WSIdentity.Namespace);
                writer.WriteString(m_hint);
                writer.WriteEndElement();
            }

            switch (m_cardType)
            {
            case DefaultValues.CardType.UserNamePassword:
                writer.WriteStartElement(XmlNames.WSIdentity.UserNamePasswordCredentialElement, XmlNames.WSIdentity.Namespace);
                if (!string.IsNullOrEmpty(m_credentialIdentifier))
                {
                    writer.WriteStartElement(XmlNames.WSIdentity.UserNameElement, XmlNames.WSIdentity.Namespace);
                    writer.WriteString(m_credentialIdentifier);
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
                break;

            case DefaultValues.CardType.KerberosAuth:
                writer.WriteStartElement(XmlNames.WSIdentity.KerberosV5CredentialElement, XmlNames.WSIdentity.Namespace);
                writer.WriteEndElement();
                break;

            case DefaultValues.CardType.SelfIssuedAuth:
                writer.WriteStartElement(XmlNames.WSIdentity.SelfIssuedCredentialElement, XmlNames.WSIdentity.Namespace);
                if (!string.IsNullOrEmpty(m_credentialIdentifier))
                {
                    writer.WriteStartElement(XmlNames.WSIdentity.PrivatePersonalIdentifierElement, XmlNames.WSIdentity.Namespace);
                    writer.WriteString(m_credentialIdentifier);
                    writer.WriteEndElement();
                }
                else
                {
                    throw new InvalidDataException("No PPID was specified");
                }
                writer.WriteEndElement();
                break;

            case DefaultValues.CardType.SmartCard:
                writer.WriteStartElement(XmlNames.WSIdentity.X509V3CredentialElement, XmlNames.WSIdentity.Namespace);

                writer.WriteStartElement(XmlNames.XmlDSig.X509DataElement, XmlNames.XmlDSig.Namespace);
                if (!string.IsNullOrEmpty(m_credentialIdentifier))
                {
                    writer.WriteStartElement(XmlNames.WSSecurityExt.KeyIdentifierElement, XmlNames.WSSecurityExt.Namespace);
                    writer.WriteAttributeString(XmlNames.WSSecurityExt.ValueTypeAttribute,
                                                null,
                                                XmlNames.WSSecurityExt.Sha1ThumbrpintKeyTypeValue);
                    writer.WriteString(m_credentialIdentifier);
                    writer.WriteEndElement();
                }
                else
                {
                    throw new InvalidDataException("No thumbprint was specified");
                }
                writer.WriteEndElement();
                writer.WriteEndElement();
                break;

            default:
                break;
            }
            writer.WriteEndElement(); //end of user credential
            writer.WriteEndElement(); // end of tokenservice
            writer.WriteEndElement(); //end of tokenservice list
            //
            // tokentypes
            //
            writer.WriteStartElement(XmlNames.WSIdentity.SupportedTokenTypeListElement, XmlNames.WSIdentity.Namespace);
            foreach (string type in m_tokenTypes)
            {
                writer.WriteElementString(XmlNames.WSTrust.TokenType,
                                          XmlNames.WSTrust.Namespace,
                                          type);
            }
            writer.WriteEndElement();

            //
            // claims
            //
            writer.WriteStartElement(XmlNames.WSIdentity.SupportedClaimTypeListElement, XmlNames.WSIdentity.Namespace);
            foreach (ClaimInfo clm in m_supportedClaims)
            {
                writer.WriteStartElement(XmlNames.WSIdentity.SupportedClaimTypeElement, XmlNames.WSIdentity.Namespace);
                writer.WriteAttributeString(XmlNames.WSIdentity.UriAttribute, clm.Id);


                if (!String.IsNullOrEmpty(clm.DisplayTag))
                {
                    writer.WriteElementString(XmlNames.WSIdentity.DisplayTagElement,
                                              XmlNames.WSIdentity.Namespace,
                                              clm.DisplayTag);
                }

                if (!String.IsNullOrEmpty(clm.Description))
                {
                    writer.WriteElementString(XmlNames.WSIdentity.DescriptionElement,
                                              XmlNames.WSIdentity.Namespace,
                                              clm.Description);
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            //
            // RequireAppliesTo
            //
            if (m_requireAppliesTo)
            {
                writer.WriteElementString(XmlNames.WSIdentity.RequireAppliesToElement, XmlNames.WSIdentity.Namespace, null);
            }

            //
            // Privacy Notice
            //
            if (!String.IsNullOrEmpty(m_privacyNoticeAt))
            {
                writer.WriteStartElement(XmlNames.WSIdentity.PrivacyNoticeAtElement, XmlNames.WSIdentity.Namespace);
                writer.WriteString(m_privacyNoticeAt);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.Close();



            //
            // Sign the xml content
            //
            stream.Position = 0;

            XmlDocument doc = new XmlDocument();

            doc.PreserveWhitespace = false;
            doc.Load(stream);

            SignedXml signed = new SignedXml();

            signed.SigningKey = cert.PrivateKey;
            signed.Signature.SignedInfo.CanonicalizationMethod
                = SignedXml.XmlDsigExcC14NTransformUrl;

            Reference reference = new Reference();

            reference.Uri = "#_Object_InfoCard";
            reference.AddTransform(
                new XmlDsigExcC14NTransform());
            signed.AddReference(reference);


            KeyInfo         info = new KeyInfo();
            KeyInfoX509Data data = new KeyInfoX509Data(cert,
                                                       X509IncludeOption.WholeChain);

            info.AddClause(data);

            signed.KeyInfo = info;
            DataObject cardData = new DataObject("_Object_InfoCard", null, null, doc.DocumentElement);

            signed.AddObject(cardData);

            signed.ComputeSignature();

            XmlElement e = signed.GetXml();

            XmlTextWriter fileWriter = new XmlTextWriter(filename, Encoding.UTF8);

            e.WriteTo(fileWriter);
            fileWriter.Flush();
            fileWriter.Close();
        }
示例#16
0
        public XmlDocument CreateInformationCardXML(InformationCard card)
        {
            MemoryStream stream = new MemoryStream();
            XmlWriter    writer = XmlWriter.Create(stream);

            writer.WriteStartElement("InformationCard", "http://schemas.xmlsoap.org/ws/2005/05/identity");


            writer.WriteAttributeString("lang", "http://www.w3.org/XML/1998/namespace", "en-US");
            writer.WriteStartElement("InformationCardReference", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            writer.WriteElementString("CardId", "http://schemas.xmlsoap.org/ws/2005/05/identity", card.CardReference.CardID);
            writer.WriteElementString("CardVersion", "http://schemas.xmlsoap.org/ws/2005/05/identity", card.CardReference.CardVersion.ToString());
            writer.WriteEndElement();

            if (card.CardName != null && card.CardName.Length > 0)
            {
                writer.WriteStartElement("CardName", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                writer.WriteString(card.CardName);
                writer.WriteEndElement();
            }



            if (card.CardImage != null && card.CardImage.ImageName.Length > 0)
            {
                writer.WriteStartElement("CardImage", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                if (card.CardImage != null && card.CardImage.ImageMimeType != null && card.CardImage.ImageMimeType.Length > 0)
                {
                    writer.WriteAttributeString("MimeType", card.CardImage.ImageMimeType);
                }

                FileInfo cardImage = new FileInfo(card.CardImage.ImageName);
                if (cardImage.Exists)
                {
                    byte[] cardImageBytes = new byte[cardImage.Length];
                    using (FileStream imageFS = cardImage.OpenRead())
                    {
                        imageFS.Read(cardImageBytes, 0, cardImageBytes.Length);
                    }


                    string imageBase64 = Convert.ToBase64String(cardImageBytes);
                    writer.WriteString(imageBase64);
                    writer.WriteEndElement();
                }
            }


            writer.WriteStartElement("Issuer", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            writer.WriteString(card.Issuer);
            writer.WriteEndElement();

            //writer.WriteStartElement("IssuerName", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            //writer.WriteString(card.IssuerName);
            //writer.WriteEndElement();

            writer.WriteStartElement("TimeIssued", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            writer.WriteString(XmlConvert.ToString(card.TimeIssued, XmlDateTimeSerializationMode.Utc));
            writer.WriteEndElement();


            writer.WriteStartElement("TimeExpires", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            writer.WriteString(XmlConvert.ToString(card.TimeExpires, XmlDateTimeSerializationMode.Utc));
            writer.WriteEndElement();


            writer.WriteStartElement("TokenServiceList", "http://schemas.xmlsoap.org/ws/2005/05/identity");


            foreach (TokenService ts in card.TokenServiceList)
            {
                EndpointAddressBuilder endpointBuilder = new EndpointAddressBuilder();

                endpointBuilder.Uri = new Uri(ts.EndpointReference.Address);

                endpointBuilder.Identity = new X509CertificateEndpointIdentity(RetrieveCertificate(ts.EndpointReference.Identity));

                if (null != ts.EndpointReference.Mex)
                {
                    MetadataReference mexReference = new MetadataReference();
                    mexReference.Address        = new EndpointAddress(ts.EndpointReference.Mex);
                    mexReference.AddressVersion = AddressingVersion.WSAddressing10;

                    MetadataSection mexSection = new MetadataSection();
                    mexSection.Metadata = mexReference;

                    MetadataSet mexSet = new MetadataSet();
                    mexSet.MetadataSections.Add(mexSection);


                    MemoryStream mexMemoryStream = new MemoryStream();

                    XmlTextWriter mexWriter = new XmlTextWriter(mexMemoryStream, System.Text.Encoding.UTF8);

                    mexSet.WriteTo(mexWriter);

                    mexWriter.Flush();

                    mexMemoryStream.Seek(0, SeekOrigin.Begin);

                    XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(mexMemoryStream, XmlDictionaryReaderQuotas.Max);

                    endpointBuilder.SetMetadataReader(reader);


                    writer.WriteStartElement("TokenService", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                    EndpointAddress endpoint = endpointBuilder.ToEndpointAddress();
                    endpoint.WriteTo(AddressingVersion.WSAddressing10, writer);

                    writer.WriteStartElement("UserCredential", "http://schemas.xmlsoap.org/ws/2005/05/identity");


                    if (ts.UserCredential.DisplayCredentialHint != null && ts.UserCredential.DisplayCredentialHint.Length > 0)
                    {
                        writer.WriteStartElement("DisplayCredentialHint", "http://schemas.xmlsoap.org/ws/2005/05/identity");


                        if (ts.UserCredential.UserCredentialType == CredentialType.SelfIssued)
                        {
                            //Override the user value as this should be false for types of SelfIssued
                            ts.UserCredential.DisplayCredentialHint = "false";
                        }
                        writer.WriteString(ts.UserCredential.DisplayCredentialHint);
                        writer.WriteEndElement();
                    }

                    switch (ts.UserCredential.UserCredentialType)
                    {
                    case CredentialType.SelfIssued:


                        writer.WriteStartElement("SelfIssuedCredential", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                        if (!string.IsNullOrEmpty(ts.UserCredential.Value))
                        {
                            writer.WriteStartElement("PrivatePersonalIdentifier", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                            writer.WriteString(ts.UserCredential.Value);
                            writer.WriteEndElement();
                        }
                        writer.WriteEndElement();
                        break;

                    case CredentialType.UsernameAndPassword:
                        writer.WriteStartElement("UsernamePasswordCredential", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                        if (!string.IsNullOrEmpty(ts.UserCredential.Value))
                        {
                            writer.WriteStartElement("Username", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                            writer.WriteString(ts.UserCredential.Value);
                            writer.WriteEndElement();
                        }
                        writer.WriteEndElement();
                        break;

                    case CredentialType.Kerberos:
                        writer.WriteStartElement("KerberosV5Credential", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                        writer.WriteEndElement();
                        break;


                    case CredentialType.SmartCard:
                        writer.WriteStartElement("X509V3Credential", "http://schemas.xmlsoap.org/ws/2005/05/identity");

                        writer.WriteStartElement("X509Data", "http://www.w3.org/2000/09/xmldsig#");
                        if (!string.IsNullOrEmpty(ts.UserCredential.Value))
                        {
                            writer.WriteStartElement("KeyIdentifier", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                            writer.WriteAttributeString("ValueType",
                                                        null,
                                                        "http://docs.oasis-open.org/wss/2004/xx/oasis-2004xx-wss-soap-message-security-1.1#ThumbprintSHA1");
                            writer.WriteString(RetrieveCertificate(ts.UserCredential.Value).Thumbprint);
                            writer.WriteEndElement();
                        }
                        else
                        {
                            throw new InvalidDataException("No thumbprint was specified");
                        }
                        writer.WriteEndElement();
                        writer.WriteEndElement();
                        break;

                    default:
                        break;
                    }
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
            writer.WriteEndElement(); //end of tokenservice list
            //
            // tokentypes
            //
            writer.WriteStartElement("SupportedTokenTypeList", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            foreach (TokenType tokenType in card.AcceptedTokenTypes)
            {
                writer.WriteElementString("TokenType",
                                          "http://schemas.xmlsoap.org/ws/2005/02/trust",
                                          tokenType.Uri);
            }
            writer.WriteEndElement();

            //
            // claims
            //
            writer.WriteStartElement("SupportedClaimTypeList", "http://schemas.xmlsoap.org/ws/2005/05/identity");
            foreach (CardClaim claim in card.SupportedClaimTypeList)
            {
                writer.WriteStartElement("SupportedClaimType", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                writer.WriteAttributeString("Uri", claim.Uri);


                if (!String.IsNullOrEmpty(claim.DisplayTag))
                {
                    writer.WriteElementString("DisplayTag", "http://schemas.xmlsoap.org/ws/2005/05/identity",
                                              claim.DisplayTag);
                }

                if (!String.IsNullOrEmpty(claim.Description))
                {
                    writer.WriteElementString("Description", "http://schemas.xmlsoap.org/ws/2005/05/identity",
                                              claim.Description);
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();


            if (card.RequireRPIdentification)
            {
                writer.WriteElementString("RequireAppliesTo", "http://schemas.xmlsoap.org/ws/2005/05/identity", card.RequireRPIdentification.ToString());
            }


            if (!String.IsNullOrEmpty(card.PrivacyNotice))
            {
                writer.WriteStartElement("PrivacyNotice", "http://schemas.xmlsoap.org/ws/2005/05/identity");
                writer.WriteString(card.PrivacyNotice);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.Close();



            stream.Position = 0;

            XmlDocument doc = new XmlDocument();

            doc.PreserveWhitespace = false;
            doc.Load(stream);

            return(doc);
        }