0

我有带有 Owin 的示例 WebForms 应用程序。尝试使用 Azure AD IdP 进行 SAML2 身份验证。它工作正常,用户在应用程序中注册并通过身份验证。

现在我需要使用其他 IdP。所以我改变了我的申请,什么也没有。Saml 响应包含成功,因此 IdP 对我进行了身份验证。但是调用 Context.GetOwinContext().Authentication.GetExternalLoginInfo() 返回 null。

我发现了一些关于“外部 cookie”的帖子,但我认为这不是我的问题,因为 Azure 示例工作正常。切换到其他 IdP 失败。

唯一的区别似乎在于 SAML Xml 格式。Azure 返回为

<samlp:Response Destination="https://localhost:44390/Saml2/Acs"
  ID="_5eaccd77-fa78-4f59-86d9-67049ef074ce" InResponseTo="id73419322f1cc440184f456548cee7d09"
  IssueInstant="2018-12-21T15:00:58.248Z" Version="2.0"
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
</samlp:Response>

但其他 IdP 返回为

<saml2p:Response Destination="https://localhost:44390/Saml2/Acs"
  ID="_9547020d571863ef02c1f6d3dc8d94d7" InResponseTo="id46574a117a254f06a272ec02769b1a3c"
  IssueInstant="2018-12-21T14:31:54.505Z" Version="2.0"
  xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
</saml2p:Response>

但是命名空间应该没问题。

所以它一定是 SAML 响应中的东西?我怎样才能发现问题?

   private static Saml2AuthenticationOptions CreateSaml2Options()
    {
        var spOptions = CreateSpOptions();
        var saml2Options = new Saml2AuthenticationOptions(false)
        {
            SPOptions = spOptions
        };

        var idp = new IdentityProvider(new EntityId("XXX"), spOptions)
        {
            AllowUnsolicitedAuthnResponse = true,
            Binding = Saml2BindingType.HttpPost,
            SingleSignOnServiceUrl = new Uri("XXX")
        };

        saml2Options.IdentityProviders.Add(idp);

        return saml2Options;
    }

    private static SPOptions CreateSpOptions()
    {
        const string language = "cs-cz";

        var spOptions = new SPOptions
        {
            EntityId = new EntityId("app:vwg.skoda.nia"),
            AuthenticateRequestSigningBehavior = SigningBehavior.Always,
            ReturnUrl = new Uri("https://localhost:44390/Saml2/Acs")
        };

        var attributeConsumingService = new AttributeConsumingService
        {
            IsDefault = true,
            ServiceNames = { new LocalizedName("Saml 2 Authentication", "en") }
        };

        attributeConsumingService.RequestedAttributes.Add(new RequestedAttribute("Minimal"));

        spOptions.AttributeConsumingServices.Add(attributeConsumingService);

        var certPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/XXX.pfx";
        var cert = new X509Certificate2(certPath, "XXX");
        spOptions.ServiceCertificates.Add(cert);

        return spOptions;
    }
4

1 回答 1

1

Sustainsys.Saml2.Exceptions.InvalidSignatureException:使用签名中包含的密钥正确验证了签名,但该密钥不受信任。

这意味着签名是正确的,但您尚未将签名密钥配置为受信任。

您需要将带有 idp 公钥的证书添加到 IdentityProvider.SigningKeys 集合中。

于 2018-12-31T11:54:40.597 回答