Как преобразовать строку токена SAML XML в экземпляр SecurityToken или ClaimsPrincipal? - PullRequest
25 голосов
/ 01 апреля 2010

Мой контекст:

  • .Net RESTful веб-сервис
  • Клиент (смешанные платформы, технологии, возможности lib) получил токен SAML
  • Попытка принять токен для аутентификации / авторизации в службе REST
    • в заголовке HTTP-авторизация / X-авторизация
    • в качестве параметра запроса
  • Позже также будет поддерживать SWT, но необходимо запустить токены SAML

подробности:

У меня есть токен SAML в строке:

<saml:Assertion xmlns:saml="..." ...> ..etc... </>

В модуле HttpModule я хочу преобразовать это в ClaimsPrincipal, чтобы мой сервис мог выполнять обычный Thread.CurrentPrincipal в качестве материала IClaimsPrincipal.

Я нашел пару привлекательных страниц / блогов / и т. Д., Которые выглядели полезными:

Я буквально застрял, пытаясь превратить токен SAML в принцип ClaimsPrincipal (через промежуточный шаг SecurityToken или через прямой ... в любом случае, довольный). Пример кода из идеи Cibrax использует следующее для решающего этапа проверки и десериализации:

SecurityTokenSerializer securityTokenSerializer 
    = new SecurityTokenSerializerAdapter(
        FederatedAuthentication.SecurityTokenHandlers, 
        MessageSecurityVersion.Default.SecurityVersion, 
        false, new SamlSerializer(), null, null);

SecurityToken theToken 
    = WSFederationAuthenticationModule.GetSecurityToken(
        theSamlTokenInStringForm, securityTokenSerializer);

Стена, по которой я столкнулся, состоит в том, что RTM-версия WIF не представляет эту перегрузку GetSecurityToken ... она только предоставляет:

WSFederationAuthenticationModule fam = new WSFederationAuthenticationModule();
SecurityToken theToken = fam.GetSecurityToken(HttpRequest theRequest);
SecurityToken theToken = fam.GetSecurityToken(SignInResponseMessage message);

Спасибо, что помогли мне отклеиться!

Тайлер

Ответы [ 4 ]

2 голосов
/ 16 сентября 2013

Просто нашел это полезным. http://www.tecsupra.com/blog/system-identitymodel-manually-parsing-the-saml-token/

Основная идея: вам нужен XML-узел "Аудитория", а затем вы можете использовать SecurityTokenHandlerCollection и использовать "ValidateToken"

Из должности:

       string samlTokenXml = signInResponseXml
            .DocumentElement  // <trust:RequestSecurityTokenResponseCollection>
            .ChildNodes[0] // <trust:RequestSecurityTokenResponse>
            .ChildNodes[2] // <trust:RequestedSecurityToken>
            .InnerXml; // <Assertion>

        var xmlTextReader = new XmlTextReader(new StringReader(samlTokenXml));

        SecurityTokenHandlerCollection handlers = 
       FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;

        // read the token
        SecurityToken securityToken = handlers.ReadToken(xmlTextReader);
1 голос
/ 27 сентября 2012

Я хочу поделиться некоторыми ресурсами, которые я нашел очень полезными для реализации по сути того же сценария. По сути, Доминик Байер - бог в этом пространстве. Его блог полон отличной информации на эту тему:

http://leastprivilege.com/

Для преобразования токена SAML / SWT в IClaimsIdentity в службе RESTful:

http://www.develop.com/wcfrest/

http://identitymodel.codeplex.com/

0 голосов
/ 13 декабря 2011

Для устранения последнего исключения, пожалуйста, проверьте тег и его содержимое и убедитесь, что он правильный. Я не могу сказать, у какого элемента есть проблема. Мы повторяем эту ошибку несколько раз, и каждый раз причиной была неправильная идентификация раздела модели.

0 голосов
/ 02 апреля 2010

Хорошо, некоторый прогресс ... если я сделаю следующее, я получу еще больше:

Microsoft.IdentityModel.Configuration.ServiceConfiguration serviceConfig
    = new Microsoft.IdentityModel.Configuration.ServiceConfiguration();

// Now read the token and convert it to an IPrincipal
SecurityToken theToken = null;
ClaimsIdentityCollection claimsIdentity = null;
using (XmlReader reader = XmlReader.Create(new StringReader(authSamlString)))
{
    theToken = serviceConfig.SecurityTokenHandlers.ReadToken(reader);
    claimsIdentity = serviceConfig.SecurityTokenHandlers.ValidateToken(theToken);
}

IPrincipal principal = new ClaimsPrincipal(claimsIdentity);

Следующая стена, которую я наткнулся:

Теперь я получаю исключение при сгенерированном мастером распределении хостов службы REST здесь:

<%@ ServiceHost Language="C#" Debug="true" Service="Sample.RestService.Service" Factory="Sample.RestService.AppServiceHostFactory"%>

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using Microsoft.ServiceModel.Web.SpecializedServices;

namespace Sample.RestService 
{
  class AppServiceHostFactory : ServiceHostFactory
  {
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        /// ***** The exception occurs on the next line *****
        return new SingletonServiceHost(serviceType, baseAddresses);
    }
  }
}

Сведения об исключении:

System.Configuration.ConfigurationErrorsException occurred
  Message="This element is not currently associated with any context"
  Source="System.Configuration"
  BareMessage="This element is not currently associated with any context"
  Line=0
  StackTrace:
       at System.Configuration.ConfigurationElement.get_EvaluationContext()
  InnerException: {{NONE}}
...