Thinktecture — невозможно обработать зашифрованный токен безопасности SAML в веб-API

Как настроить Thinktechture Saml2SecurityTokenHandler в .net Web API для использования сертификата X509 для обработки зашифрованного токена безопасности SAML2 (расшифруйте его перед проверкой).

Маркер был зашифрован Identity Server путем настройки RP для использования сертификата для шифрования.

Ниже приведена рабочая конфигурация (без обработки зашифрованного токена), взятая из примеров Thinktechture:

  #region IdentityServer SAML
  authentication.AddSaml2(
                issuerThumbprint: Constants.IdSrv.SigningCertThumbprint,
                issuerName: Constants.IdSrv.IssuerUri,
                audienceUri: Constants.Realm,
                certificateValidator: X509CertificateValidator.None,
                options: AuthenticationOptions.ForAuthorizationHeader(Constants.IdSrv.SamlScheme),
                scheme: AuthenticationScheme.SchemeOnly(Constants.IdSrv.SamlScheme));
  #endregion

person RonyK    schedule 13.08.2013    source источник
comment
вы видели это   -  person itsho    schedule 15.08.2013
comment
@itsho: Моя проблема отличается от той, что обсуждалась в этой ветке, поскольку я пытаюсь обработать зашифрованный токен безопасности. Когда я отключаю шифрование в Identity Server, оно обрабатывается правильно. Спасибо.   -  person RonyK    schedule 15.08.2013


Ответы (2)


Чтобы включить зашифрованные токены с помощью веб-API, я нашел это полезным: http://www.alexthissen.nl/blogs/main/archive/2011/07/18/using-active-profile-for.aspx

Ближе к концу вы увидите код, устанавливающий свойство ServiceTokenResolver в свойстве Configuration коллекции SecurityTokenHandlerCollection с использованием сертификата X509 из хранилища LocalMachine. Свойство Configuration — это SecurityTokenHandlerConfiguration, которое является одним из параметров перегрузки метода расширения AddSaml2 в AuthenticationConfigurationExtensionsCore.cs из источника ThinkTecture.IdentityModel. Ниже показано, что у меня получилось.

var registry = new ConfigurationBasedIssuerNameRegistry();
registry.AddTrustedIssuer(Constants.IdSrv.SigningCertThumbprint, Constants.IdSrv.IssuerUri);

var handlerConfig = new SecurityTokenHandlerConfiguration();
handlerConfig.AudienceRestriction.AllowedAudienceUris.Add(new Uri(Constants.Realm));
handlerConfig.IssuerNameRegistry = registry;
handlerConfig.CertificateValidator = GetX509CertificateValidatorSetting();

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificates = store.Certificates;
X509Certificate2Collection matchingCertificates = certificates.Find(
    X509FindType.FindBySubjectDistinguishedName,
    "CN=RPTokenCertificate", false);
X509Certificate2 certificate = certificates[0];

List<SecurityToken> serviceTokens = new List<SecurityToken>();
serviceTokens.Add(new X509SecurityToken(certificate));
SecurityTokenResolver serviceResolver =
    SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
        serviceTokens.AsReadOnly(), false);
handlerConfig.ServiceTokenResolver = serviceResolver;

authentication.AddSaml2(handlerConfig, 
    AuthenticationOptions.ForAuthorizationHeader(SamlScheme), 
    AuthenticationScheme.SchemeOnly(SamlScheme));

Надеюсь, поможет.

person JonathanN    schedule 14.10.2013
comment
Мне все еще чего-то не хватает, когда я выбираю шифрование токена (путем выбора сертификата шифрования на странице администрирования IDP RP). Сопоставление между обработчиком маркера не происходит, поскольку заголовок авторизации полученного запроса имеет значение NULL. Заголовок авторизации отображается в массиве недопустимых заголовков свойства HTTP-заголовки запроса. - person RonyK; 21.10.2013
comment
Используя System.Net.Http.HttpClient с методом расширения ThinkTecture.IdentityModel SetToken, я получаю по сети следующий заголовок авторизации: Авторизация: SAML ‹EncryptedAssertion xmlns=urn:oasis:names:tc:SAML:2.0:assertion›‹xenc :EncryptedData ... Формат заголовка авторизации выглядит как схема «SAML», а затем полный необработанный XML. - person JonathanN; 22.10.2013
comment
Решено. Кажется, моя проблема заключалась в недопустимых символах в зашифрованном токене. После кодирования токена base64 (с использованием Thinktechture HeaderEncoding) решение, описанное в этом ответе, сработало как шарм. Описание проблемы с кодировкой см. в разделе stackoverflow.com/questions/19497841/. - person RonyK; 22.10.2013

получил этот ответ от кого-то:

    public ClaimsIdentity DecryptToken(string token)
    {
        XmlReader rdr = XmlReader.Create(new StringReader(token));

        SecurityTokenHandlerConfiguration config = new SecurityTokenHandlerConfiguration();
        config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("urn:yourRP"));
        config.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
        config.RevocationMode = X509RevocationMode.NoCheck;

        ConfigurationBasedIssuerNameRegistry inr = new ConfigurationBasedIssuerNameRegistry();
        X509Certificate2 cert = new X509Certificate2(pathToSigningCert);
        inr.AddTrustedIssuer(cert.Thumbprint, "STS Name");

        config.IssuerNameRegistry = inr;
        config.CertificateValidator = System.IdentityModel.Selectors.X509CertificateValidator.None;

        SecurityTokenHandlerCollection handlers = System.IdentityModel.Tokens.SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection(config);

        if (handlers.CanReadToken(rdr))
        {
            var tmpToken = handlers.ReadToken(rdr);
            var claimsIds = handlers.ValidateToken(tmpToken);
            var id = claimsIds.FirstOrDefault();
        }
    }

Не уверен, что это поможет.

что вы использовали в качестве имени эмитента? имя веб-сайта, который вы настраиваете в IIS? или значение, которое вы ввели в поле «Идентификатор сайта» на странице «Общая конфигурация» в разделе «Администрирование» IdentityServer?

person Sam    schedule 30.08.2013