Проблема при обращении к конечной точке ADFS на сервере - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть служба, настроенная для получения безопасного токена из ADFS и использования этого токена для связи с другими службами. Когда я связываюсь со своей оконечной точкой ADFS, работающей на Windows, с моего локального компьютера, на котором работает служба ADFS, я могу успешно получить токен. Однако, когда я устанавливаю свою службу на той же машине, на которой работает ADFS, я получаю следующую ошибку:

 Secure channel cannot be opened because security negotiation with the remote endpoint has failed. This may be due to absent or incorrectly specified EndpointIdentity in the EndpointAddress used to create the channel. Please verify the EndpointIdentity specified or implied by the EndpointAddress correctly identifies the remote endpoint.

Я могу воспроизвести ошибку с помощью следующего кода, который просто получает токен. Опять же, этот код работает, когда я нахожусь на моей машине разработчика, попадающей на удаленный сервер, но не работает, когда на сервере напрямую. Я использую одни и те же учетные данные пользователя на обоих. Я получаю ту же ошибку в веб-службе IIS с использованием учетных данных пула приложений и с помощью простого тестового клиента с использованием приведенного ниже кода.

    private static SecurityToken GetToken()
    {
        string stsEndpoint = "https://adfsserver.com/adfs/services/trust/13/windowsmixed";
         string appliesTo = "http://domain.com/application/myapplication";

        var factory = new WSTrustChannelFactory(
            new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential),
            stsEndpoint);
        factory.TrustVersion = TrustVersion.WSTrust13;

        var rst = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            AppliesTo = new EndpointAddress(appliesTo),
            KeyType = KeyTypes.Symmetric
        };

        var channel = factory.CreateChannel();
        return channel.Issue(rst);
    }

Я включил трассировку в журнале событий Windows для отладки ADFS 2.0. При попадании в эту оконечную точку windowsmixed непосредственно на сервер, я не получаю никаких записей, которые заставляют меня поверить, что она на самом деле не достигает конечной точки.

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

Subject:
    Security ID:        DOMAIN\ODI$ODIController
    Account Name:       ODI$ODIController
    Account Domain:     DOMAIN
    Logon ID:       0x1a574b5

Object:
    Object Server:      SC Manager
    Object Type:        SERVICE OBJECT
    Object Name:        WinHttpAutoProxySvc
    Handle ID:      0x0

Process Information:
    Process ID:     0x1f8
    Process Name:       C:\Windows\System32\services.exe

Access Request Information:
    Transaction ID:     {00000000-0000-0000-0000-000000000000}
    Accesses:       Query status of service
                Start the service
                Query information from service

    Access Reasons:     -
    Access Mask:        0x94
    Privileges Used for Access Check:   -

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

Если я установлю определенные учетные данные в приведенном выше коде, он сможет подключиться. Что снова заставляет меня поверить, что он не передает правильные учетные данные для моего пользователя Windows, когда на той же машине.

 factory.Credentials.Windows.ClientCredential = new System.Net.NetworkCredential("UserID", "password1", "dev.domain");

Спасибо за любую помощь, которую вы можете оказать.

Brian

1 Ответ

1 голос
/ 28 марта 2012

У меня была похожая проблема.Я смог заставить его работать, используя приведенный ниже пример: http://blogs.southworks.net/mwoloski/2009/07/17/getting-a-token-from-adfs-ex-geneva-server-using-wcf/

Разница между вашим кодом и рабочим примером заключается в том, что вы изменяете безопасность сообщения, чтобы использовать текущие учетные данные безопасности в привязке, а не вклиент.Если вы используете WIF 4.0, вам нужно изменить код, чтобы использовать WSTrustChannelFactory вместо WSTrustClient.Другой код не сильно меняется, хотя.

Мой код для фабрики выглядит так:

var binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential); binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; binding.Security.Message.EstablishSecurityContext = false;

var factory = new WSTrustChannelFactory( binding, new EndpointAddress(new Uri(sts), EndpointIdentity.CreateUpnIdentity(adfsUpn)));

...