C# Kentor AuthServices发送AuthnRequests Asp.Net Core

C# Kentor AuthServices发送AuthnRequests Asp.Net Core,c#,kentor-authservices,C#,Kentor Authservices,我有一个Asp.Net核心web应用程序,目前正在使用Kentor AuthServices实现SP启动的SSO。现在,我从idP收到了以下格式的元数据文件: <?xml version="1.0" encoding="UTF-8"?> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"

我有一个Asp.Net核心web应用程序,目前正在使用Kentor AuthServices实现SP启动的SSO。现在,我从idP收到了以下格式的元数据文件:

<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" 
 xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
 entityID="https://exampleidp.com">
<md:IDPSSODescriptor 
 protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing">
   <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
      <X509Data>
         <X509Certificate>ExampleCertificate</X509Certificate>
      </X509Data>
   </KeyInfo>
</md:KeyDescriptor>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified
</md:NameIDFormat>
<md:SingleSignOnService
 Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
 Location="https://exampleidp.com/loginpage"/>
<md:SingleLogoutService 
 Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
 Location="https://exampleidp.com/logoutpage"/>
<saml:Attribute Name="accountID" 
 NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
 FriendlyName="accountID"/>
<saml:Attribute Name="email" 
 NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
 FriendlyName="email"/>
<saml:Attribute Name="firstName" 
 NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
 FriendlyName="firstName"/>
<saml:Attribute Name="lastName" 
 NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 
 FriendlyName="lastName"/> 
</md:IDPSSODescriptor>
<md:ContactPerson contactType="technical">
   <md:GivenName>Exampleidp</md:GivenName>
   <md:SurName>Support</md:SurName>
   <md:EmailAddress>exampleidp.support@exampleidp.com</md:EmailAddress>
</md:ContactPerson>
<md:Organization>
   <md:OrganizationName xml:lang="en">Example Idp</md:OrganizationName>
   <md:OrganizationDisplayName xml:lang="en">Example Idp</md:OrganizationDisplayName>
   <md:OrganizationURL xml:lang="en">http://exampleidp.com/</md:OrganizationURL>
</md:Organization>  
</md:EntityDescriptor>
以及配置中的以下代码段:

app.UseAuthentication();
更新

在详细阅读了源代码之后,我终于能够回过头来生成authnrequest,如下所示(我用idP验证了这一点):


http://myapp.com

编辑:我现在主要关心的是如何向idP发送AuthnRequest。如果我的思路正确,那么我需要对AuthnRequest进行压缩和编码,以便idP正确处理它。我想知道如何才能实现这一点(看起来我可能还需要包含RelayState信息?)要么使用现有的Kentor代码,要么可能很容易自己完成?

最终更新,并给出答案:经过大量研究和探索,我终于能够解决最后一个问题,即将AuthnRequest设置为需要发送到idP的适当压缩和base64编码字符串。我使用以下代码块实现了这一点:

var param = "";
        var bytes = Encoding.UTF8.GetBytes(authnRequest.ToXElement().ToString());
        using (var output = new MemoryStream())
        {
            using (var zip = new DeflateStream(output, CompressionMode.Compress))
            {
                zip.Write(bytes, 0, bytes.Length);
            }
            var base64String = Convert.ToBase64String(output.ToArray());
            param =  HttpUtility.UrlEncode(base64String);
        }

这触发了idP的正确响应,因此我现在能够正确触发我的SP的SSO,并从idP获取响应值。

最终更新,回答:经过大量研究和探索,我终于能够解决最后一个问题,即将AuthnRequest设置为正确的需要发送到idP的已压缩和base64编码字符串。我使用以下代码块实现了这一点:

var param = "";
        var bytes = Encoding.UTF8.GetBytes(authnRequest.ToXElement().ToString());
        using (var output = new MemoryStream())
        {
            using (var zip = new DeflateStream(output, CompressionMode.Compress))
            {
                zip.Write(bytes, 0, bytes.Length);
            }
            var base64String = Convert.ToBase64String(output.ToArray());
            param =  HttpUtility.UrlEncode(base64String);
        }

它触发了idP的正确响应,因此我现在能够正确触发SP的SSO,并从idP获取响应值。

我应该/可以如何创建需要发送到idP的AuthnRequest。如果您提供代码来显示您尝试过的内容,这会有所帮助。我理解,如果我有一些代码来说明我尝试过的内容,这会有所帮助,但到目前为止,我一直在努力深入研究软件包并了解实现过程,虽然我尝试了各种方法,但我现在知道,在投入了大量时间之后,我还远没有成功实现。所以,这就是为什么我发布了这篇文章,希望有人能引导我走向正确的方向,或者给我一些建议,因为我似乎在这一点上把自己弄糊涂了。如果我提出任何有价值的东西,我一定会编辑并发布我所拥有的。我应该/能够如何创建需要发送给idP的AuthnRequest。如果您提供代码来显示您尝试过的内容,这会有所帮助。我理解,如果我有一些代码来说明我尝试过的内容,这会有所帮助,但到目前为止,我一直在努力深入研究软件包并了解实现过程,虽然我尝试了各种方法,但我现在知道,在投入了大量时间之后,我还远没有成功实现。所以,这就是为什么我发布了这篇文章,希望有人能引导我走向正确的方向,或者给我一些建议,因为我似乎在这一点上把自己弄糊涂了。如果我提出任何有价值的东西,我一定会编辑和发布我所拥有的。
var param = "";
        var bytes = Encoding.UTF8.GetBytes(authnRequest.ToXElement().ToString());
        using (var output = new MemoryStream())
        {
            using (var zip = new DeflateStream(output, CompressionMode.Compress))
            {
                zip.Write(bytes, 0, bytes.Length);
            }
            var base64String = Convert.ToBase64String(output.ToArray());
            param =  HttpUtility.UrlEncode(base64String);
        }