Skip to content
February 1, 2012 / ahriman hpc mode

[Перевод] Что нового в WCF 4.5? Поддержка множественной аутентификации на одну точку входа в IIS

Оглавление:

1. Что нового в WCF 4.5? Начнём с конфигурации WCF
2. Что нового в WCF 4.5? Один WSDL-файл.
3. Что нового в WCF 4.5? Подсказки конфигурации и intellisense в файлах конфигурации
4. Что нового в WCF 4.5? Проверки конфигурации
5. Что нового в WCF 4.5? Поддержка множественной аутентификации на одну точку входа в IIS
6. Что нового в WCF 4.5? Точка входа HTTPS для IIS
7. Что нового в WCF 4.5? BasicHttpsBinding
8. Что нового в WCF 4.5? Изменения в режиме совместимости ASP.NET
9. Что нового в WCF 4.5? Улучшенный стриминг в IIS

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

Примечание: Механизм аутентификации в посте относится к клиентской аутентификации, используемой в HTTP (хидер Authorization HTTP) как при HTTPS так и при HTTP.

При хостинге WCF-сервисов в ISS множество разработчиков бьются над проблемой объявления типов аутентификации, так как имеется два места, где вам необходимо настроить тип аутентификации – в конфигурации сервиса и конфигурации IIS.

Если вы не настроили все правильно в обоих местах, значит, у вас будет несоответствие между типами аутентификации точки входа и типами аутентификации IIS, что может привести к ошибке типа:

The authentication schemes configured on the host (‘Basic, Anonymous’) do not allow those configured on the binding ‘WSHttpBinding’ (‘Negotiate’). Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly. Additionally, this may be resolved by changing the authentication schemes for this application through the IIS management tool, through the ServiceHost.Authentication.AuthenticationSchemes property, in the application configuration file at the <serviceAuthenticationManager> element, by updating the ClientCredentialType property on the binding, or by adjusting the AuthenticationScheme property on the HttpTransportBindingElement.

Ошибка сообщает, что вы настроили basic и anonymous аутентификацию в IIS, но пытаетесь использовать Negotiate (Windows authentication с Kerberos) в конфигурации вашего сервиса, что не поддерживается хостом IIS.

Это весьма напрягает, поэтому WCF 4.5 предлагает наследовать типы аутентификации от IIS, что позволяет настраивать аутентификацию в одном месте.

Как же можно это сделать? Для меня понимание процесса заняло какое-то время, так как это новая не очень документированная фича. Поэтому вот инструкция:

1. Создайте сервис и разместите его в IIS.

2. Определите точку входа сервиса на использование любой привязки HTTP (basicHttp, wsHttp…).

3. Создайте конфигурации привязки для точки входа и укажите security в Transport или TransportCredentialsOnly (basicHttp).

4. В конфигурации транспорта установите значение атрибута clientCredentialType в InheritedFromHost –это новое значение, доступное в WCF 4.5. В данный момет это значение не документировано в MSDN.

Таким образом, теперь конфигурация вашего сервиса может выглядеть так:

<services>
    <service name="MyService">
        <endpoint address="" binding="basicHttpBinding" contract="Mycontract" bindingConfiguration="secured"/>
    </service>
</services>
<bindings>
    <basicHttpBinding>
        <binding name="secured">
            <security mode="Transport">
                <transport clientCredentialType="InheritedFromHost"/>
            </security>
        </binding>
    </basicHttpBinding>
</bindings>

Примечание: Если вы используете basicHttpBinding, вы можете использовать либо transport security либо transportCredentialsOnly security (используйте вторую опцию только если не используете basic аутентификацию). Для wsHttpBinding вам необходимо использовать transport security для получения типа InheritedFromHost.

5. Откройте IIS и установите типы аутентификации в необходимые вам – anonymous, basic, digest, NTLM, windows, или certificate. Разумеется, вы можете отметить несколько опций.

clip_image001

6. После настройки типов аутентификации в IIS попробуйте перейти в браузере на файл сервиса WSDL и проверить типы аутентификации:

<wsp:ExactlyOne>
    <http:NegotiateAuthentication xmlns:http="http://schemas.microsoft.com/ws/06/2004/policy/http"/>
    <http:NtlmAuthentication xmlns:http="http://schemas.microsoft.com/ws/06/2004/policy/http"/>
</wsp:ExactlyOne>

Примечание: Anonymous authentication не показывается как тип аутентификации. Для того, чтобы узнать, какие типы появляются в файле WSDL, вы можете почитать MSDN .

7. На стороне клиента добавьте ссылку на сервис в ваш сервис. Сгенерированная конфигурация будет настроена в соответствии с типами аутентификации, установленными в IIS:

a. Если вы настроили один тип аутентификации, конфигурация будет настроена на него. Например, basic, тогда конфигурация будет настроена на использование basic:

<basicHttpBinding>
    <binding name="BasicHttpBinding_IService1">
        <security mode="Transport">
            <transport clientCredentialType="Basic" />
        </security>
    </binding>
</basicHttpBinding>

b. Если вы установили более одного типа в IIS, все немного сложнее. Клиентская сторона не имеет соответствующего атрибута “InheritedFromHost” и не может включить более чем одного элемента транспорта, поэтому тип будет обычно установлен в первый тип, установленный в WSDL. Например, если вы используете basic и digest, скорее всего у клиента вы увидите только digest authentication:

<wsHttpBinding>
    <binding name="WSHttpBinding_IService1">
        <security mode="Transport">
            <transport clientCredentialType="Digest" />
        </security>
    </binding>
</wsHttpBinding>

Если вы используете в IIS только anonymous authentication, конфигурация клиента будет выглядеть так:

<wsHttpBinding>
    <binding name="WSHttpBinding_IService1">
        <security mode="Transport">
            <transport clientCredentialType="None" />
        </security>
    </binding>
</wsHttpBinding>

Небольшое примечание о стандартной конфигурации – basicHttp и wsHttp имеют разные значения по умолчанию для клиентского типа. Если тип аутентификации в IIS является стандартным типом вы увидите следующую конфигурацию привязки (пример для привязки wsHttp):

<wsHttpBinding>
    <binding name="WSHttpBinding_IService1">
        <security mode="Transport"/>                
    </binding>
</wsHttpBinding>

Стандартное значение для basicHttp – none, стандартное для wsHttp – Windows. Для примера выше конфигураци привязки была сгенерирована так как в IIS тип установлен в Windows.

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

Резюмируя, без этой фичи нам необходимо объявить несколько точек входа, по одной для каждого типа, но наши клиенты способны видеть то, что ожидает сервис. С новой фичей нам необходима одна точка входа, остальное конфигурируется в IIS, но наши клиенты имеют больше проблем с пониманием того, что им доступно.

Таким образом, этой фиче +1 к серверной стороне и –1 к клиентской.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: