当前位置: 首页 > 知识库问答 >
问题:

ASP.NET MVC 5将Web SSO与未解析的外部IDP-WS馈送元数据一起使用

裴英才
2023-03-14

我尝试将Web SSO与WS-Federation一起用于ASP.NET MVC5应用程序中的外部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

现在我不知道什么是坏的了?外部IDP联合元数据、ASP.NET MVC配置或其他内容。

当我在登录过程中使用外部IDP尝试外部SP调用HTTP GET时,URI格式为:

https://domain.com/fed/idp/samlv20?SAMLRequest=

然后我被重定向到外部IDP登录页面。

我尝试了与本地IDP(Identity ServerV3)相同的配置过程,它起作用了。

当我使用本地SP时,在登录it调用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登录页面。

也许我需要实现ASP.NET使用格式为https://domain.com/fed/idp/samlv20?samlrequest=的URI进行SAML HTTP重定向绑定。

谢谢你的任何有用的反馈。

共有1个答案

吴腾
2023-03-14

看来你在混淆协议。元数据是针对SAML2协议(简称SAML2P)的,而不是针对WS-Federation协议的。

您需要一个SAML2P owin中间件,而不是WS-Fed中间件。除非您可以让Idp使用WS-Federation(即WS-Federation)。

 类似资料:
  • 我目前正在使用BPMN和Activiti创建一些业务流程。对于该业务流程中的一个步骤,我需要查询数据库并在后续步骤中使用该结果。因此,我正在寻找可能的解决方法,将SQL操作功能集成到Activiti中。那么,有谁能建议我,是否有任何方法可以为activiti嵌入sql查询功能?对于使用Activiti引擎为BPMN进程提供外部数据库交互的任何建议,我们深表感谢。 如果这样的解决方案不存在,那么关于

  • 实际上,我们使用Google IdP作为应用程序的SSO/SAML身份验证类型。我们已将其配置为将用户连接到应用程序,并且运行良好。但最近,我们还想要求用户对应用程序生命周期中可能发生的不同操作进行重新验证。 更详细地说,当我们向Google Idp发送SAML请求时,我们在节点“AuthnRequest”中添加了属性ForceAuthn=“true”,我们还添加了AuthnContextClas

  • 关于Jenkins管道和Groovy方法,我这里有两个问题。首先,我有多个共享公共方法的构建,所以我认为最好将所有这些都放在一个类中,然后为每个构建导入文件。 Groovy脚本中的一段代码如下所示 在我的管道脚本中,我有 我遇到的第一个问题是如何在我的方法中使用,其次,当我收到错误时,如何在我的脚本中使用 哈德逊。远程处理。ProxyException:groovy。lang.MissingMet

  • 首先,我知道这个问题在这个网站上到处都是,但是我看了几乎所有的问题,似乎找不到问题所在。这是在VS 2012中。谢谢。 这是插座。cpp公司 这是stdafx。h类 这是我的错误消息:

  • 我正在开发一个Spring REST微服务。代码使用RestTemboard访问其他服务。它是这样配置的: 使用此配置,注入的restTemplate实例将解析域中指定的服务名称,并调用相应的服务。例如,以下调用将起作用: 问题是,我们还希望使用外部服务并使用RestTemplate查询它们。 例如不起作用,应用程序会抱怨发现服务不知道服务。 更有趣的是,在某些情况下,网址是未知的,所以在开发过程

  • 问题内容: 情况 我正在使用EclipseLink的MOXy,并且正在尝试将外部OX映射XML与实现Map接口的类一起使用。但是,每次尝试创建JAXBContext时,都会得到以下NPE: 细节 仅当要映射的类实现java.util.Map接口时,才会发生此问题。如果我正在映射的类未实现该接口,则一切正常。这是我要映射的类的简化示例: 这是我要使用的MOXy OX元数据的简化示例: 这是我创建我的