2015-01-27 7 views
1

У меня есть служба WCF, которая работает нормально.WCF самостоятельно размещен HTTPS с пользовательским UserNamePasswordValidator

  • Он используется в сети интранет.
  • Это самостоятельная служба (без IIS), управляемая простой программой Windows Form.
  • Используется клиентом WCF (WPF C#).

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

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

Я в настоящее время использую basicHttpBinding. MS рекомендует использовать NetTcpBinding в моем случае (https://msdn.microsoft.com/en-us/library/ff648863.aspx#TransportSecurityWCF), но я не уверен, что это или можно защитить?

Я думаю, что лучше использовать WsHttpBinding для SSL: как вы думаете, эта ссылка обеспечивает правильное решение для моего дела? https://msdn.microsoft.com/en-us/library/ms733775.aspx?

Спасибо за ваши советы

+0

Любой код для показа? Поскольку ваш проект предназначен для интрасети, «NetTcpBinding» - лучший подход, и он может быть защищен **. [Расскажите подробнее] (http://www.amazon.com/Programming-WCF-Services-Mastering-AppFabric/dp/0596805489) – MickyD

+0

Возможный дубликат [wcf net.tcp using SSL] (http://stackoverflow.com/questions/2455251/wcf-net-tcp-using-ssl) – MickyD

+0

спасибо за ваши первые ответы. У меня есть код, но бесполезно показывать здесь, поскольку это очень простой базовый HTTP-сервис WCF. – phramusca

ответ

1

Вы можете сделать шифрование SSL/Transport с BasicHttpBinding. Это не нужно менять; вам просто нужно настроить хост-сервер с безопасностью «Транспорт», добавить код и сертификат, и вы сможете продолжить, не меняя слишком много кода. Я могу включить небольшой пример кода ниже, так как я сделал то же самое, что вы пытаетесь сделать с помощью самообслуживания.

BasicHttpBinding b = default(BasicHttpBinding); 
if (bUseSSL) { 
    //check for ssl msg credential bypass 
    if (bSSLMsgCredentialBypass) { 
     b = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); 
    } else { 
     b = new BasicHttpBinding(BasicHttpSecurityMode.Transport); 
    } 

    b.TransferMode = TransferMode.Buffered; 
    b.MaxReceivedMessageSize = int.MaxValue; 
    b.MessageEncoding = WSMessageEncoding.Text; 
    b.TextEncoding = System.Text.Encoding.UTF8; 
    b.BypassProxyOnLocal = false; 
    //b.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate; 
} 

Аутентификация/авторизация также могут быть выполнены без изменения того, что у вас есть. У вас действительно есть два варианта:

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

Другой способ заключается в создании этой пользовательской проверки подлинности с использованием функции инспектора сообщений, обнаруженной в Dispatcher.IDispatchMessageInspector, и публичной функции, называемой AfterReceiveRequest. Внутри этой функции вы можете проверить UserID и Pwd (из данных заголовка HTTP), отправленных с клиентов, но вам нужно реализовать это как на стороне клиента, так и на стороне хоста, иначе это не сработает.

+0

Спасибо за ваш вклад. Я, наконец, использую это решение: http://leastprivilege.com/2007/10/31/finally-usernames-over-transport-authentication-in-wcf/ (также в некоторых других местах). У меня возникли проблемы с добавлением SSL, но, наконец, удалось после целого дня труда! – phramusca