Внедрение ACS и ADFS как STS

Мы пытаемся использовать образец 4 ACS (из http://claimsid.codeplex.com/) в качестве шаблона для нашего проекта ADFS. У нас нет проблем с пассивными запросами к службам с аутентификацией ADFS. В примере провайдер федерации - это настраиваемая служба STS, и образец работает нормально.

Теперь мы хотим заменить настраиваемого поставщика федерации (Adatum FP в примере) нашим собственным ADFS.

Наша установка сейчас выглядит следующим образом (пространства имен скрыты)

  • ServiceClient: Консольное приложение, вызывает сервисы
  • Службы: WCF Webservice, одиночный метод, возвращающий строку. Это значение по умолчанию [Ordertracking.Services in sample]
  • Services.Authentication: наш собственный поставщик удостоверений. Это значение по умолчанию [Litware.SimulatedIssuer в примере]
  • ADFS: наш поставщик федерации [в примере FederationProvider.Adatum]

ServiceClient хочет вызвать Services, и из конфигурации он знает, что ему нужно получить токен с IP (Services.Authentication). Затем токен передается в ADFS, который проверяет токен и отправляет новый токен обратно в ServiceClient. Новый клиент передает токен FP службе, а служба (являющаяся проверяющей стороной в ADFS) проверяет токен на соответствие ADFS и выполняет метод службы.

Проблема:

Замена STS в примере на ADFS, похоже, нарушает интеграцию. Похоже, что мы получаем токен с IP-адреса правильно, но мы сталкиваемся с проблемами при передаче IP-токена в ADFS. Кажется, у нас проблема с Uri нашей аудитории, но мы добавили

https: // 'adfs fqdn' / adfs / services / Trust / 13 / IssuedTokenMixedSymmetricBasic256

Client Exception Мы получаем MessageSecurityException в клиенте с этим InnerException InnerException {"ID3242: токен безопасности не может быть аутентифицирован или авторизован."}

[System.ServiceModel.FaultException]: {"ID3242: The security token could not be authenticated or authorized."}
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
InnerException: null
Message: "ID3242: The security token could not be authenticated or authorized."
Source: null
StackTrace: null
TargetSite: null

Журнал отладки ADFS

<TraceRecord xmlns="http://schemas.microsoft.com/2009/10/IdentityModel/TraceRecord" Severity="Error">
    <Description>Handled exception.</Description>
    <AppDomain>Microsoft.IdentityServer.ServiceHost.exe</AppDomain>
    <Exception>
        <ExceptionType>Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ExceptionType>
        <Message>ID1038: The AudienceRestrictionCondition was not valid because the specified Audience is not present in AudienceUris. Audience: 'https://<adfs fqdn>/adfs/services/Trust/13/IssuedTokenMixedSymmetricBasic256'</Message>
        <StackTrace>
  at Microsoft.IdentityModel.Tokens.SamlSecurityTokenRequirement.ValidateAudienceRestriction(IList`1 allowedAudienceUris, IList`1 tokenAudiences) at Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateConditions(Saml2Conditions conditions, Boolean enforceAudienceRestriction) at Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateToken(SecurityToken token) at Microsoft.IdentityServer.Service.Tokens.MSISSaml2TokenHandler.ValidateToken(SecurityToken token) at Microsoft.IdentityModel.Tokens.WrappedSaml2SecurityTokenAuthenticator.ValidateTokenCore(SecurityToken token) at System.IdentityModel.Selectors.SecurityTokenAuthenticator.ValidateToken(SecurityToken token) at Microsoft.IdentityModel.Tokens.WrappedSamlSecurityTokenAuthenticator.ValidateTokenCore(SecurityToken token) at System.IdentityModel.Selectors.SecurityTokenAuthenticator.ValidateToken(SecurityToken token) at System.ServiceModel.Security.ReceiveSecurityHeader.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver, IList`1 allowedTokenAuthenticators, SecurityTokenAuthenticator&amp;amp; usedTokenAuthenticator) at
  ....
        </StackTrace>
    </Exception>
</TraceRecord>

Мы добавили uri аудитории в наш IP Web.config:

<audienceUris mode="Always">
    <add value="https://<adfs fqdn>/adfs/services/Trust/13/IssuedTokenMixedSymmetricBasic256" />
</audienceUris>

При необходимости мы можем разместить дополнительные файлы конфигурации и скриншоты конфигурации ADFS.


person anders    schedule 19.10.2011    source источник


Ответы (2)


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

Несколько советов всем, кто пробует это сделать - сначала создайте соединения в коде. С конфигурацией XML работать немного сложнее.

Мы нашли образец кода на сайте lessprivilege.com.

private static SecurityToken GetIdPToken()
    {

        var factory = new WSTrustChannelFactory(
            new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
            "https://systemidp.dk/Issuer.svc");
        factory.TrustVersion = TrustVersion.WSTrust13;

        factory.Credentials.UserName.UserName = "LITWARE\\rick";
        factory.Credentials.UserName.Password = "thisPasswordIsNotChecked";

        var rst = new RequestSecurityToken
        {
            RequestType = WSTrust13Constants.RequestTypes.Issue,
            AppliesTo = new EndpointAddress("https://adfsfqdn/adfs/services/trust"),
            KeyType = WSTrust13Constants.KeyTypes.Symmetric,
            ReplyTo = "https://adfsfqdn/adfs/services/trust/13/issuedtokenmixedsymmetricbasic256/"
        };
        factory.ConfigureChannelFactory();
        var channel = factory.CreateChannel();
        return channel.Issue(rst);
    }

    private static SecurityToken GetRSTSToken(SecurityToken idpToken)
    {
        var binding = new IssuedTokenWSTrustBinding();
        binding.SecurityMode = SecurityMode.TransportWithMessageCredential;

        var factory = new WSTrustChannelFactory(
            binding,
            "https://adfsfqdn/adfs/services/trust/13/issuedtokenmixedsymmetricbasic256/");
        factory.TrustVersion = TrustVersion.WSTrust13;
        factory.Credentials.SupportInteractive = false;

        var rst = new RequestSecurityToken
        {
            RequestType = WSTrust13Constants.RequestTypes.Issue,
            AppliesTo = new EndpointAddress("https://services.dk/WebService.svc"),
            KeyType = WSTrust13Constants.KeyTypes.Symmetric
        };

        factory.ConfigureChannelFactory();
        var channel = factory.CreateChannelWithIssuedToken(idpToken);
        return channel.Issue(rst);
    }

Создание вызова WCF с токеном

var ipdtoken = GetIdPToken();
var stsToken = GetRSTSToken(ipdtoken);
var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.EstablishSecurityContext = false;
var factory = new ChannelFactory<IWebService>(binding, "https://services.dk/WebService.svc");

factory.ConfigureChannelFactory();
factory.Credentials.SupportInteractive = false;

var serviceChannel = factory.CreateChannelWithIssuedToken(stsToken);

var s = serviceChannel.GetUserInformation();
person anders    schedule 25.10.2011
comment
Совет всем, кто пробует это сделать - сначала создайте соединения в коде. С конфигурацией XML немного сложнее работать. Это лучший совет, который я нашел за все время моего пути к WIF. - person Rick Liddle; 09.10.2012

Конфигурация auditUri на вашем IP-адресе выглядит нормально. Я думаю, что именно ADFS выдает ошибку ID3242. Можете ли вы проверить, правильно ли настроен ваш IP-адрес в разделе «Доверие поставщика утверждений» на вашем сервере ADFS?

Если у вас есть метаданные федерации вашего IP-адреса, вы также можете попробовать воссоздать их в ADFS.

person Andrew Lavers    schedule 24.10.2011