Внедрение ACS с и ADFS в качестве STS - PullRequest
3 голосов
/ 19 октября 2011

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

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

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

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

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

Проблема:

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

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

Клиентское исключение Мы получаем 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.

Ответы [ 2 ]

5 голосов
/ 25 октября 2011

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

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

Мы нашли некоторый пример кода наimumprivilege.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();
0 голосов
/ 24 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...