C# Kentor AuthServices发送AuthnRequests Asp.Net Core
我有一个Asp.Net核心web应用程序,目前正在使用Kentor AuthServices实现SP启动的SSO。现在,我从idP收到了以下格式的元数据文件: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"
<?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);
}