2015-04-29 4 views
0

У нас есть процесс Windows Service, который постоянно обрабатывает сообщения отMicrosoft Messaging Queue. Действуя на эти сообщения, он вызывает методы из службы WCF.Вызов службы WCF, размещенной на сайте проверки подлинности форм из службы Windows.

Эта служба WCF размещена на веб-сайте ASP.net, где есть не только службы WCF , но и конечный пользовательский интерфейс. Как правило, WCF-методы - это , изменяющие структуры данных в памяти, а передние - их считывание. Данные постоянно изменяются, и клиентам необходимо незамедлительно получать уведомления об изменениях . (Мы используем SignalR.)

Все работает отлично до тех пор, пока сайт ASP.net использует Windows Интегрированная проверка подлинности. Теперь требуется, чтобы на передней панели были использованы формы Аутентификация. Это, разумеется, нарушило привязку WCF. Предыдущий связывании был:

<basicHttpBinding> 
    <binding name="BasicHttpBinding_ISessionWebService"> 
    <security mode="Transport"> 
     <transport clientCredentialType="Windows" /> 
    </security> 
    </binding> 
</basicHttpBinding> 

Front-конечные пользователи не должны быть в состоянии назвать услуги. (На самом деле, они не должны быть в состоянии.)

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

Как я могу предоставить конечную точку WCF таким образом, чтобы она была защищена и может быть вызвана из службы Windows?

ответ

0

Это оказалось легче, чем я думал. Секретный соус менял режим безопасности на привязку к TransportWithMessageCredential.

"Programming WCF Security" От:

Транспортная безопасность зависит от механизма, что связывание у вас есть выбранного применения. Например, если вы используете WSHttpBinding, то механизм безопасности - это Secure Sockets Layer (SSL) (также механизм для протокола HTTPS). Вообще говоря, основным преимуществом транспортной безопасности является то, что она обеспечивает хорошую пропускную способность независимо от того, какой транспортный транспорт вы используете .Тем не менее, у него есть два ограничения: первое, что транспортный механизм диктует тип учетных данных , используемый для аутентификации пользователя ....

В TransportWithMessageCredential, HTTPS по-прежнему используется для обеспечения передачи сообщения, но вы не вынуждены использовать схему аутентификации механизма транспорта. Таким образом, сайт IIS все еще может быть настроен с использованием Аутентификация форм, но сообщение WCF завершено с использованием Windows. В вяжущие выглядит следующим образом:

<wsHttpBinding> 
    <binding name="WsHttpEndpoint"> 
    <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="None" /> 
     <message clientCredentialType="Windows" /> 
    </security> 
    </binding> 
</wsHttpBinding> 

Оттуда, вы можете обеспечить методы службы WCF с использованием PrincipalPermissionAttribute, т.е .:

[PrincipalPermission(SecurityAction.Demand, Role = "DOMAIN\\SomeGroup")] 
public void DoWork() 
{   
} 
0

AFAIK IIS 7 не позволит этого, обходные пути кажутся более эскизными, чем просто создание двух сайтов.

Вы можете создать две службы на разных сайтах IIS на сервере. Служба данных будет использовать Windows Authentication и хранить структуры данных. Служба внешнего доступа будет использовать Forms Authentication, а затем перенаправить запрос в службу данных. Вы можете использовать пользовательский идентификатор для пула приложений для внешней службы, если вы хотите исключить другие веб-сайты с использованием Identity ApplicationPool.

Смежные вопросы