【问题标题】:ASP.NET MVC 5 Use Web SSO with external IDP - WS Fed metadata not parsedASP.NET MVC 5 使用带有外部 IDP 的 Web SSO - 未解析 WS Fed 元数据
【发布时间】: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


    【解决方案1】:

    看起来您混淆了协议。元数据适用于 SAML2 协议(简称 SAML2P),而不适用于 WS-Federation 协议。

    您需要一个 SAML2P owin 中间件,而不是 WS-Fed 中间件。除非您可以让 Idp 使用 WS-Federation,否则就是这样。

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 1970-01-01
      • 2013-11-08
      • 2015-12-11
      • 2020-12-05
      • 2015-04-03
      • 2022-07-26
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多