Kentor AuthServices 发送 AuthnRequests Asp.Net Core
Kentor AuthServices Sending AuthnRequests Asp.Net Core
我有一个 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>
连同两个签名证书。在我的 Startup.cs 中,我在 ConfigureServices 中添加了以下代码片段:
.AddSaml2(options =>
{
options.SPOptions.EntityId = new EntityId("http://myapp.com");
options.IdentityProviders.Add(
new IdentityProvider(
new EntityId("myapp.com/Metadata.xml"), options.SPOptions)
{
LoadMetadata = true
});
})
以及配置中的以下代码片段:
app.UseAuthentication();
更新
在仔细查看源代码之后,我终于能够全神贯注地生成如下所示的 AuthnRequests(我使用 idP 进行了验证):
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
ID="idcc70905185a04a94b05282e0c544e086" Version="2.0" IssueInstant="2017-
11-13T14:47:56Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
AssertionConsumerServiceURL="http://myapp.com/saml">
<saml2:Issuer>http://myapp.com</saml2:Issuer>
<saml2p:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-
format:unspecified" AllowCreate="true" />
</saml2p:AuthnRequest>
编辑: 我现在主要关心的是我需要如何将 AuthnRequest 发送到 idP。看起来,如果我在正确的轨道上,我需要压缩和编码 AuthnRequest 以便 idP 正确处理它。我想知道如何实现这一目标(看起来我可能还需要包含 RelayState 信息?)使用现有的 Kentor 代码还是可能很容易自己完成?
带有答案的最终更新: 经过大量研究和探索,我终于能够解决最终成为我最后一个问题的问题,即将 AuthnRequest 设置为正确的 deflated 和 base64需要发送给 idP 的编码字符串。我使用以下代码块实现了这一点:
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 获取响应值。
我有一个 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>
连同两个签名证书。在我的 Startup.cs 中,我在 ConfigureServices 中添加了以下代码片段:
.AddSaml2(options =>
{
options.SPOptions.EntityId = new EntityId("http://myapp.com");
options.IdentityProviders.Add(
new IdentityProvider(
new EntityId("myapp.com/Metadata.xml"), options.SPOptions)
{
LoadMetadata = true
});
})
以及配置中的以下代码片段:
app.UseAuthentication();
更新
在仔细查看源代码之后,我终于能够全神贯注地生成如下所示的 AuthnRequests(我使用 idP 进行了验证):
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
ID="idcc70905185a04a94b05282e0c544e086" Version="2.0" IssueInstant="2017-
11-13T14:47:56Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
AssertionConsumerServiceURL="http://myapp.com/saml">
<saml2:Issuer>http://myapp.com</saml2:Issuer>
<saml2p:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-
format:unspecified" AllowCreate="true" />
</saml2p:AuthnRequest>
编辑: 我现在主要关心的是我需要如何将 AuthnRequest 发送到 idP。看起来,如果我在正确的轨道上,我需要压缩和编码 AuthnRequest 以便 idP 正确处理它。我想知道如何实现这一目标(看起来我可能还需要包含 RelayState 信息?)使用现有的 Kentor 代码还是可能很容易自己完成?
带有答案的最终更新: 经过大量研究和探索,我终于能够解决最终成为我最后一个问题的问题,即将 AuthnRequest 设置为正确的 deflated 和 base64需要发送给 idP 的编码字符串。我使用以下代码块实现了这一点:
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 获取响应值。