【发布时间】:2016-10-27 12:47:11
【问题描述】:
我尝试将 Web SSO 与 WS-Federation 一起用于来自 ASP.NET MVC 5 应用程序的外部 IDP。
在这种情况下,ASP.NET 应用程序是服务提供者。
对于登录,我想使用 SAML HTTP 重定向绑定。
外部 IDP WS-FED 元数据:
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="id-58j8Ew5J8B7hOu51hu5qYyIGsXc-"
cacheDuration="P0Y0M30DT0H0M0.0S" entityID="idp:domain.com"
validUntil="2016-07-24T18:51:12Z">
<md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing">
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:X509Data>
<dsig:X509Certificate>
<!-- CERT -->
</dsig:X509Certificate>
<dsig:X509IssuerSerial>
<dsig:X509IssuerName><!--ISSUER--></dsig:X509IssuerName>
<dsig:X509SerialNumber><!--SN--></dsig:X509SerialNumber>
</dsig:X509IssuerSerial>
<dsig:X509SubjectName><!--CN--></dsig:X509SubjectName>
</dsig:X509Data>
</dsig:KeyInfo>
</md:KeyDescriptor>
<md:KeyDescriptor use="encryption">
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:X509Data>
<dsig:X509Certificate>
<!-- CERT -->
</dsig:X509Certificate>
<dsig:X509IssuerSerial>
<dsig:X509IssuerName>
<!--ISSUER-->
</dsig:X509IssuerName>
<dsig:X509SerialNumber>
<!--SN-->
</dsig:X509SerialNumber>
</dsig:X509IssuerSerial>
<dsig:X509SubjectName>
<!--CN-->
</dsig:X509SubjectName>
</dsig:X509Data>
</dsig:KeyInfo>
<md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" />
<md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes192-cbc" />
<md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
<md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
</md:KeyDescriptor>
<md:ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
Location="https://domain.com/fed/idp/soap" index="1"
isDefault="true" />
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
Location="https://domain.com/fed/idp/samlv20"
ResponseLocation="https://domain.com/fed/idp/samlv20" />
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://domain.com/fed/idp/samlv20"
ResponseLocation="https://domain.com/fed/idp/samlv20" />
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://domain.com/fed/idp/samlv20" />
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
Location="https://domain.com/fed/idp/samlv20" />
</md:IDPSSODescriptor>
</md:EntityDescriptor>
Start.up.cs 中的身份验证设置:
public partial class Startup
{
private static readonly string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
private static readonly string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];
public static bool ValidateServerCertificate(object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
return true;
}
public void ConfigureAuth(IAppBuilder app)
{
//only for dev purpose
ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
var wsFedOpt = new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata,
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
TokenValidationParameters = new TokenValidationParameters
{
SaveSigninToken = true,
},
};
app.UseWsFederationAuthentication(wsFedOpt);
}
}
当我运行应用程序时出现错误:
序列不包含任何元素
说明:
在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.InvalidOperationException:序列不包含任何元素
来源错误:
在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
堆栈跟踪:
[InvalidOperationException:序列不包含元素] System.Linq.Enumerable.First(IEnumerable`1 源)+264 Microsoft.IdentityModel.Protocols.d__1.MoveNext() +576 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+92 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)+11532712 Microsoft.IdentityModel.Protocols.d__3.MoveNext() +1236
现在我不知道什么是坏的?外部 IDP 联合元数据、ASP.NET MVC 配置或其他内容。
当我在登录期间尝试使用外部 IDP 的外部 SP 时,它调用 HTTP GET,URI 格式为:
https://domain.com/fed/idp/samlv20?SAMLRequest=
然后我被重定向到外部 IDP 登录页面。
我尝试使用本地 IDP (Identity Server v3) 进行相同的配置过程,它可以工作。
当我使用本地 SP 时,身份验证也在登录期间基于本地 IDP(身份服务器 v3)元数据配置,它调用 HTTP GET:
https://localhost:44333/core/wsfed?wtrealm=urn%3amvc5&wctx=WsFedOwinState%3dqNRmL2H9VZcEDKooeSF5nywV2vAHUDLXRSA77oe8jyVwZtGjpgRquhqYNUPbH28vrhm55zuEBYZnRw_k2nK-a97HHv9tiYLnwt4G19i1-q0&wa=wsignin1.0&wreply=https%3a%2f%2flocalhost%3a44392%2f
然后我被重定向到 IDP 登录页面。
也许我需要以 https://domain.com/fed/idp/samlv20?SAMLRequest= 格式实现 ASP.NET 使用 URI 以进行 SAML HTTP 重定向绑定。
感谢您提供任何有用的反馈。
【问题讨论】:
标签: asp.net-mvc-5 single-sign-on saml-2.0 http-redirect ws-federation