Как я могу пройти аутентификацию, используя учетные данные клиента в WCF только один раз?

StackOverflow https://stackoverflow.com/questions/30800

Вопрос

Каков наилучший подход, чтобы убедиться, что вам нужно пройти аутентификацию только один раз при использовании API, построенного на WCF?

Мои текущие привязки и поведение перечислены ниже

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>

Далее то, что я использую в своем клиентском приложении для аутентификации (в настоящее время я должен делать это каждый раз, когда хочу выполнить вызов в WCF)

Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService")
client.ClientCredentials.UserName.UserName = "foo"
client.ClientCredentials.UserName.Password = "bar"
Dim ProductList As List(Of Product) = client.GetProducts()

Что я хотел бы сделать, так это выполнить аутентификацию с помощью API один раз, используя эти учетные данные, а затем получить некоторый тип токена на тот период времени, пока мое клиентское приложение использует проект веб-службы.Я думал, что establishsecuritycontext=true сделал это за меня?

Это было полезно?

Решение

Если вы находитесь в интрасети, проверка подлинности Windows может быть выполнена "бесплатно" только с помощью настройки.

Если это неуместно, службы токенов работают просто отлично, но в некоторых ситуациях их может быть просто слишком много.

Приложению, над которым я работаю, требовалась простая аутентификация.Наш сервер и клиент работают внутри (очень безопасной) интрасети, поэтому нас не слишком заботило требование использовать сертификат X.509 для шифрования связи, что требуется, если вы используете аутентификацию по имени пользователя.

Поэтому мы добавили пользовательское поведение клиенту, который добавляет имя пользователя и (зашифрованный) пароль к заголовкам сообщений, и другому пользовательскому поведению на сервере, которое их проверяет.

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

Другие советы

Хотя я ненавижу давать ответ, в котором я не уверен на 100%, отсутствие ответов на данный момент заставляет меня думать, что потенциально правильный ответ может подойти в данном случае.

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

Я только что закончил работу над проектом, в котором мы внедрили наш собственный механизм сеансов для обработки всевозможных устаревших стеков SOAP, но я считаю, что рекомендуемый способ реализации аутентифицированных сеансов - использовать службу безопасных токенов (STS), такую как Пабло Сибраро.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top