Как я могу аутентифицироваться, используя учетные данные клиента в WCF только один раз? - PullRequest
1 голос
/ 27 августа 2008

Каков наилучший способ убедиться, что вам нужно пройти аутентификацию только один раз при использовании 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 один раз, используя эти учетные данные, а затем получить токен определенного типа на тот период времени, когда мое клиентское приложение использует проект веб-службы. Я думал, что установитеsecuritycontext = true сделал это для меня?

Ответы [ 2 ]

3 голосов
/ 31 августа 2008

Если вы находитесь в интрасети, аутентификация Windows может быть обработана бесплатно для одной конфигурации.

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

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

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

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

1 голос
/ 29 августа 2008

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

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

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

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

...