IDX10503: Ошибка проверки подписи после обновления до Owin.Security v 4.0.0

Согласно теме, я обновил Owin.Security.WsFederation и зависимые пакеты до версии 4.0 и получаю сообщение об ошибке.

Я не делал никаких изменений в коде, кроме изменения

using Microsoft.IdentityModel.Protocols; 

to

using Microsoft.IdentityModel.Protocols.WsFederation;

где сейчас класс WsFederationConfiguration кажется.

Вот мой 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:

Вот изменения, которые я внес, чтобы использовать метаданные wsfed, предоставленные sts в файле свойств. (Я удалил фактические метаданные в кодировке base64, но нет необходимости говорить, что это тот же самый XML, который вы получаете, когда повторно загружаете метаданные из STS, которая публикует их как конечную точку. Как я уже сказал выше, я получаю ту же ошибку:

    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);
    }

person PilotBob    schedule 15.03.2018    source источник


Ответы (2)


Я работал с некоторыми людьми в команде в MS. Проблема здесь заключалась в том, что наша STS использует SHA1 для подписи токена, а новая версия weFederation не поддерживает SHA1, поскольку он небезопасен и устарел.

person PilotBob    schedule 23.03.2018

Самый простой способ использовать WIF с owin — это использование метаданных федерации (которые находятся по адресу FederationMetadata/2007-06/FederationMetadata.xml). Тогда вам вообще ничего не нужно настраивать, как описано в Настройка веб-приложений на основе утверждений с помощью ПО промежуточного слоя OWIN WsFederation . Предварительным условием, конечно же, является то, что ваша STS публикует значимый FederationMetaData документ. Приятным преимуществом является то, что ваши открытые ключи, необходимые для проверки, автоматически подбираются вашим приложением (и их обновление выполняется без проблем).

Это ИМХО, это намного проще, чем подход, который вы используете.

Вы можете выполнить ручную настройку поставщика удостоверений OWIN WS-Federation, так как он описывает более простой способ, чем ваш.

person Amirhossein Mehrvarzi    schedule 22.03.2018
comment
Моя служба STS не публикует метаданные в качестве конечной точки. Они предоставляют его в файле свойств. Итак, я изменил код, как я сказал в своем обновлении, чтобы создать WsConfiguration из метаданных в файле свойств. Я получаю ту же самую ошибку. - person PilotBob; 22.03.2018