簡體   English   中英

對XML的Saml2Assertion為空

[英]Saml2Assertion to XML is empty

我嘗試使用SOAP數據創建HttpWebRequest,並且在SOAP標頭中,我將必須添加SAML 2聲明,該聲明包含Windows證書存儲中的證書。

所以我這樣說:

Saml2Assertion oSAMLAssertion =
  new Saml2Assertion (
    new Saml2NameIdentifier (oPSCertificate.Subject)
  );
oSAMLAssertion.Id = new Saml2Id ();
oSAMLAssertion.IssueInstant = DateTime.Now;

oSAMLAssertion.Subject =
  new Saml2Subject (new Saml2NameIdentifier ("CPS") { Value = sPSID });

oSAMLAssertion.Statements
  .Add (
    new Saml2AttributeStatement (
      new Saml2Attribute ("identifiantFacturation", sIDFact)
    ));
oSAMLAssertion.Statements
  .Add (
    new Saml2AttributeStatement (
      new Saml2Attribute ("codeSpecialiteAMO", sCodeSpec)
    ));

oSAMLAssertion.SigningCredentials =
  new X509SigningCredentials (oPSCertificate);

沒問題。 但是,當我希望將此斷言的XML添加到我的SOAP請求中時,我將像這樣進行操作:

StringBuilder oXML = new StringBuilder ();
XmlWriter oXMLSerializer = XmlWriter.Create (
  oXML,
  new XmlWriterSettings () { ConformanceLevel = ConformanceLevel.Fragment }
);
Saml2SecurityToken o = new Saml2SecurityToken (oSAMLAssertion);
o2.WriteToken (oXMLSerializer, o);

但是我的oXML.ToString返回空,我沒有XML ...我檢查了.NET源引用,看是否錯過了某些東西,而且似乎沒有,我應該擁有XML ...

我究竟做錯了什么 ?

要獲取XML輸出,Saml2Assertion需要具有帶符號的簽名,否則xml將為空白。

X509Certificate2 cert =null;
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

store.Open(OpenFlags.ReadOnly);

X509Certificate2 cert =null;

foreach (var certificate in store.Certificates)
{
    if (certificate.Thumbprint=="ffffff")
        { cert = certificate; }
}

store.Close();

var assertion = new Saml2Assertion(new Saml2NameIdentifier("Name"))
    .SigningCredentials = new X509SigningCredentials(cert);


StringBuilder sb = new StringBuilder();
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = false;
settings.Encoding = Encoding.UTF8;

var stringWriter = new StringWriter(sb);
var responseWriter = XmlWriter.Create(stringWriter, settings); 

new Saml2Serializer().WriteSaml2Assertion(responseWriter, assertion);

public class Saml2Serializer : Saml2SecurityTokenHandler
{
    public Saml2Serializer()
    {
        Configuration = new SecurityTokenHandlerConfiguration()
        {};
    }

public void WriteSaml2Assertion(XmlWriter writer, Saml2Assertion data)
{
    try
    { base.WriteAssertion(writer, data); }
    catch (Exception e)
    { System.Console.Write(e.StackTrace); }      
}

    public void WriteSaml2Token(XmlWriter writer, Saml2SecurityToken data)
    {
        try
        { base.WriteToken(writer, data); }
        catch (Exception e)
        { System.Console.Write(e.StackTrace); }
    }
}

嘗試在xml writer之間添加一個stringwriter包裝器。 更改此:

XmlWriter oXMLSerializer = XmlWriter.Create(oXML, new XmlWriterSettings() { ConformanceLevel = ConformanceLevel.Fragment });

至:

using (StringWriter stringWriter = new StringWriter(oXML))
using (XmlWriter oXMLSerializer = XmlWriter.Create(stringWriter, new XmlWriterSettings() { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 }))
{
    Saml2SecurityToken o = new Saml2SecurityToken(oSAMLAssertion);
    o2.WriteToken(oXMLSerializer, o);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM