从C#4.5(WIF)断言中创建SAML响应

问题描述:

我需要一种方法将POST消息发送到某个URL,其相当简单,.NET帮助我处理类Saml2Assertion,但我似乎无法找到一种方法在响应中包装该断言并将其序列化(或者甚至在没有手动发布的情况下发送)?从C#4.5(WIF)断言中创建SAML响应

Saml2Assertion assert = new Saml2Assertion(new Saml2NameIdentifier("SAMLIssuer")); 
assert.Subject = new Saml2Subject(new Saml2NameIdentifier("10001", new Uri("urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"))); 
Saml2AuthenticationContext context = new Saml2AuthenticationContext(new Uri("urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport")); 
assert.Statements.Add(new Saml2AuthenticationStatement(context, DateTime.Now)); 

string assertion; 
using (var sw = new StringWriter()) 
{ 
    var xws = new XmlWriterSettings(); 
    using (var xw = XmlWriter.Create(sw, xws)) 
    { 
     var handler = new Saml2SecurityTokenHandler(); 
     handler.WriteToken(xw, new Saml2SecurityToken(assert)); 
    } 
    assertion = sw.ToString(); 
} 

和XML我得到断言似乎罚款:

<?xml version="1.0" encoding="utf-16"?> 
<Assertion ID="_fc348927-c0bf-4955-b98f-483043d8dedd" IssueInstant="2017-04-19T11:29:38.464Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> 
    <Issuer>SAMLIssuer</Issuer> 
    <Subject> 
     <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">10001</NameID> 
    </Subject> 
    <AuthnStatement AuthnInstant="2017-04-19T11:29:39.040Z"> 
     <AuthnContext> 
      <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthnContextClassRef> 
     </AuthnContext> 
    </AuthnStatement> 
</Assertion> 

所以,现在怎么办?我如何从我的代码得到:

<samlp:Response 
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
    ID="new id" 
    InResponseTo="old id" 
    Version="2.0" 
    IssueInstant="2017-04-19T11:29:39.040Z" 
    Destination="some url"> 
    <saml:Issuer>SAMLIssuer</saml:Issuer> 
    <samlp:Status> 
     <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> 
    </samlp:Status> 
    <saml:Assertion .... 

没有使用外部库或使我自己的包装/串连接?我似乎无法找到任何可以帮助我的WIF .NET 4.5实现。

AFAIK .NET没有内置的对SAMLp协议的支持。它只支持WsFederation。也看看这里:How should I implement SAMLP 2.0 in an ASP.NET MVC 4 service provider?

+0

无赖,看来你是对的,所以指向你。我越来越喜欢这个新的MS。 :( – mmix