Как реализовать безопасность в службе WCF, чтобы только выбранный клиент мог получить доступ к моей службе (без проверки идентификатора пользователя / пароля в каждом методе)? - PullRequest
0 голосов
/ 19 декабря 2011

Я реализовал IDispatchMessageInspector в своем сервисе WCF для обеспечения безопасности, как указано ниже.

Код на стороне клиента:

 private class mySecurityInspector : IClientMessageInspector, IDispatchMessageInspector
  {
   private const string HEADER_NS = "urn:myservice:authentication-header:2011";

   public object BeforeSendRequest(ref Message request, IClientChannel channel)
   {
     MessageHeader<string> messageHeader = new MessageHeader<string>  
                              (getAuthKeyFromConfig(), false, string.Empty, false);

    // add the new header to our request
     request.Headers.Add(messageHeader.GetUntypedHeader("",                   
                                                   HEADER_NS));
      return null;
    }

}

Серверная часть (служба):

 private class mySecurityInspector: IDispatchMessageInspector
 {
   private const string HEADER_NS = "urn:myservice:authentication-header:2011";

  public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,     
      System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext            
               instanceContext)
     {

            string authKey = request.Headers.GetHeader<string>(“”, HEADER_NS);
             if (authKey != getAuthKeyFromConfig())
            {
               throw new 
              Exception(string.Format(ServiceMessages.MSG_UNAUTHORISED_CLIENT,  
             "");
   }

}

}

Таким образом, клиент, который знает только ключ авторизации, может получить доступ к моему сервису.это то, что я сделал.но я не уверен насчет безопасности, так как думаю, что если кто-нибудь взломает этот authkey из мыла, отправленного по сетевому проводу, сможет получить доступ к моему сервису.Как защитить мой сервис в этом сценарии?Пожалуйста, предоставьте мне решение, чтобы только выбранный клиент мог получить доступ к моей услуге.

1 Ответ

1 голос
/ 19 декабря 2011

Решение в вашем сценарии - HTTPS. Вы боитесь, что кто-то может украсть authkey на проводе = вам нужен защищенный канал, и самый простой (и в вашем случае лучший) способ получить защищенный канал - это использовать HTTPS.

Я не уверен, почему вы упомянули пароль / идентификатор пользователя в заголовке вопроса, но если вы используете этот заголовок аутентификации только для успешно аутентифицированных клиентов, вы, скорее всего, заново изобретаете колесо. WCF уже поддерживает этот сценарий. Он называется SecurityContext (или сеанс безопасности) и, например, используется WSHttpBinding с Message моделью безопасности и UserName типом учетных данных клиента - учетные данные проверяются только с первым запросом и после этого клиенты отправляют токен безопасности, который является действителен на протяжении всего сеанса. Недостатком является то, что это делает ваше общение государственным

...