IDX10503:更新到 Owin.Security v 4.0.0 后签名验证失败

IDX10503: Signature validation failed after updating to Owin.Security v 4.0.0

根据主题,我将 Owin.Security.WsFederation 和依赖包更新到版本 4.0,但出现错误。

除了更改

,我没有进行任何代码更改
using Microsoft.IdentityModel.Protocols; 

using Microsoft.IdentityModel.Protocols.WsFederation;

现在WsFederationConfigurationclass在哪里

这是我的 StartupAuth:

public void ConfigureAuth(IAppBuilder app)
        {
            app.UseCookieAuthentication(
                new CookieAuthenticationOptions
                {
                    AuthenticationType = CookieAuthenticationDefaults.AuthenticationType
                });

            // Create WsFed configuration from web.config wsfed: values
            var wsconfig = new WsFederationConfiguration()
            {
                Issuer = ConfigurationManager.AppSettings["wsfed:Issuer"],
                TokenEndpoint = ConfigurationManager.AppSettings["wsfed:TokenEndPoint"],                
            };

            /* 
             * Add x509 certificates to configuration
             * 
             */
            // certificate.1 must always exist
            byte[] x509Certificate;
            x509Certificate = Convert.FromBase64String(ConfigurationManager.AppSettings["wsfed:certificate.1"]);
            wsconfig.SigningKeys.Add(new X509SecurityKey(new X509Certificate2(x509Certificate)));
            // certificate 2 may exist
            if (ConfigurationManager.AppSettings["wsfed:certificate.2"] != null)
            {
                x509Certificate = Convert.FromBase64String(ConfigurationManager.AppSettings["wsfed:certificate.2"]);
                wsconfig.SigningKeys.Add(new X509SecurityKey(new X509Certificate2(x509Certificate)));
            }
            // certificate 3 may exist
            if (ConfigurationManager.AppSettings["wsfed:certificate.3"] != null)
            {
                x509Certificate = Convert.FromBase64String(ConfigurationManager.AppSettings["wsfed:certificate.3"]);
                wsconfig.SigningKeys.Add(new X509SecurityKey(new X509Certificate2(x509Certificate)));
            }

            // Apply configuration to wsfed Auth Options
            var wsoptions = new WsFederationAuthenticationOptions
            {
                SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
                Configuration = wsconfig,
                Wreply = ConfigurationManager.AppSettings["wsfed:Wreply"],
                Wtrealm = ConfigurationManager.AppSettings["wsfed:Wtrealm"],
            };
            wsoptions.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";

            // Add WdFederation middleware to Owin pipeline
            app.UseWsFederationAuthentication(wsoptions);
        }

4.0 还需要什么东西来验证签名吗?我假设它是在谈论发行人的令牌签名。我没有看到如何启用 ShowPII 来查看它正在查看的密钥。

我正在使用具有完整框架的 MVC5。不是核心。

更新:

我尝试修改代码以使用身份提供者在属性文件中提供的元数据来创建 WsFederationConfiguration,但我仍然遇到相同的错误。我不确定签名是什么,或者如果它不在 idp 元数据中,我从哪里得到它。

更新2:

以下是我为使用属性文件中的 sts 提供的 wsfed 元数据所做的更改。 (我已经删除了实际的 base64 编码元数据,但不用说,当您从将元数据发布为端点的 STS 中注册元数据时,它与您得到的 XML 相同。正如我上面所说,我得到了同样的错误:

    public void ConfigureAuth(IAppBuilder app)
    {
        WsFederationConfiguration wsconfig;

        app.UseCookieAuthentication(
            new CookieAuthenticationOptions
            {
                AuthenticationType = CookieAuthenticationDefaults.AuthenticationType
            });

        var metaDataDocument = System.Text.Encoding.UTF8.GetString(
                Convert.FromBase64String("...c2NyaXB0b3I+"));

        using (var metaDataReader = XmlReader.Create(new StringReader(metaDataDocument), SafeSettings))
        {
            wsconfig = (new WsFederationMetadataSerializer()).ReadMetadata(metaDataReader);
        }

        // Apply configuration to wsfed Auth Options
        var wsoptions = new WsFederationAuthenticationOptions
        {
            SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
            Configuration = wsconfig,
            Wreply = ConfigurationManager.AppSettings["wsfed:Wreply"],
            Wtrealm = ConfigurationManager.AppSettings["wsfed:Wtrealm"],
        };
        wsoptions.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";

        // Add WdFederation middleware to Owin pipeline
        app.UseWsFederationAuthentication(wsoptions);
    }

将 WIF 与 owin 结合使用的最简单方法是 使用联合元数据 (位于 FederationMetadata/2007-06/FederationMetadata.xml)。 那么你根本不需要设置任何东西,这在 Configure claims based web applications using OWIN WsFederation middleware 中有解释。前提当然是你的STS发布了有意义的FederationMetaData文档。好处是您的 public 验证所需的密钥会被您的应用程序自动提取(并且无缝地更新它们)。

恕我直言,这比您采用的方法要简单得多。

您可以按照 Manual configuration of OWIN WS-Federation Identity provider 进行操作,因为它描述的方法比您的更简单。

我和 MS 团队的一些人一起工作。这里的问题是我们的 STS 使用 SHA1 对令牌进行签名,而新版本的 weFederation 不支持 SHA1,因为它是 not-secure 并且已被弃用。