首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDX10503:更新到Owin.Security v4.0.0后签名验证失败

IDX10503:更新到Owin.Security v4.0.0后签名验证失败
EN

Stack Overflow用户
提问于 2018-03-15 14:22:52
回答 2查看 1.8K关注 0票数 0

作为主题,我将Owin.Security.WsFederation和依赖程序包更新为4.0版本,并得到了错误。

除了更改以外,我没有做任何代码更改。

代码语言:javascript
复制
using Microsoft.IdentityModel.Protocols; 

代码语言:javascript
复制
using Microsoft.IdentityModel.Protocols.WsFederation;

WsFederationConfiguration类现在似乎在哪里。

这是我的StartupAuth

代码语言:javascript
复制
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元数据中,我也不知道它是从哪里来的。

Update2

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

代码语言:javascript
复制
    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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-23 21:42:12

我和团队中的一些人一起工作过,这里的问题是我们的STS正在使用SHA1来签署令牌,而新版本的weFederation不支持SHA1,因为它不安全,是不推荐的。

票数 2
EN

Stack Overflow用户

发布于 2018-03-22 08:28:14

与owin一起使用WIF的最简单方法是通过FederationMetadata/2007-06/FederationMetadata.xml).使用联邦元数据(它位于上)。,那么您就不需要在中设置任何东西了,这在使用OWIN WsFederation中间件配置基于声明的web应用程序中有解释。当然,前提条件是您的STS发布有意义的FederationMetaData文档。优点是验证所需的公钥由应用程序自动获取(并且更新它们是无缝的)。

这是IMHO,比您正在采取的方法容易得多。

您可以跟随OWIN WS的手动配置--联邦身份提供程序,因为它描述了一种比您的更简单的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49301972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档