Как реализовать простую безопасность WCF - PullRequest
1 голос
/ 21 января 2012

У нас есть клиентское приложение на C #, которое взаимодействует с нашей внутренней службой C # через WCF.Мы хотим убедиться, что каждый вызов WCF, сделанный для нашей службы, сделан пользователем, который вошел в наш клиент, а не каким-то хакером, который выяснил, как вызывать наши службы WCF.

Полагаю, есть несколько способов, которыми мы могли бы это гарантировать.Один из них заключается в том, чтобы наш метод Login бэкэнда возвращал какой-то токен, который каждый клиентский вызов WCF должен затем передавать как часть вызова WCF.Чтобы получить такой токен, вызывающая сторона должна предоставить действительные учетные данные для входа.Тогда для каждого вызова WCF токен будет проверен на обратной стороне.Если токен не может быть проверен, вызов WCF не выполняется.

Я бы хотел простой и простой способ сделать это.Нам не нужно ничего сверхсложного и безопасного.У кого-нибудь есть какая-либо информация о стандартном способе достижения этой цели?Мы используем .NET 4. Я должен добавить, что у меня нет большого опыта работы с WCF.

Немного больше информации.У нас есть два разных клиентских приложения, вызывающих наши сервисы WCF.Один из них - клиент на основе WPF, а другой - приложение на основе браузера (ASP.NET).Оба являются интернет-приложениями.Наши клиенты могут быть в любой точке мира.

Ответы [ 2 ]

1 голос
/ 21 января 2012

Самый простой способ реализовать это - использовать wsHttpBinding с такой конфигурацией:

<bindings>
  <wsHtttpBinding>
    <binding name="securitySession">
      <security mode="Message">
        <message clientCredentialType="UserName" 
                 establishSecurityContext="true"
                 negotiateServiceCredentials="false" />
      </security>
    </binding>
  </wsHttpBinding>
</binding>

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

Чтобы эта конфигурация работала в настраиваемой среде, необходимо настроить службу для использования сертификата, который будет защищать связь (в противном случаекто угодно может перехватить связь и ввести имя пользователя и пароль или токен).Вы также должны использовать пользовательский валидатор имени пользователя и пароля (или членство в ASP.NET) на стороне службы.

Как это соответствует вашему решению?

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

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

В случае WPF вы также можете избежать сеанса безопасности и выставить вторую оконечную точку своей службы с помощью establishSecurityContext="false".В этом случае имя пользователя и пароль будут включены в каждый вызов из приложения WPF, и вам не придется бороться со многими проблемами, связанными с долгоживущим прокси-сервером, используя полный сервис состояния.Без контекста службы безопасности для вашего приложения WPF будет меньше состояния.Причина, по которой вы не хотите использовать это с ASP.NET, заключается в том, что вам придется хранить имя пользователя и пароль в сеансе.

Каковы недостатки этого решения?

Это решение с большим весом.Контекст безопасности обеспечивает функциональность, которую вы ищете, без какого-либо кодирования на вашей стороне, но это имеет свою цену.Вам придется использовать сессию в приложении ASP.NET для поддержки прокси-сервера WCF, у вас будет полный сервис состояния, чего обычно следует избегать, и вам придется много работать с настройками производительности и памяти, если вы ожидаете большой нагрузки в вашем приложении.,Вы должны будете следить за тем, чтобы сеансы были корректно освобождены, а все прокси-серверы WCF были правильно закрыты и расположены так, чтобы экземпляры служб также освобождались.Вам придется поиграть с регулированием в WCF, чтобы поддерживать достаточно одновременно работающих экземпляров службы.

4 года назад я успешно использовал аналогичный подход в веб-приложении для Интернета с большой нагрузкой, но нам потребовалось некоторое время, чтобы найти все проблемы, правильно настроить все таймауты и правильно обработать освобождение всех объектов.

В качестве альтернативы вы можете найти федеративный сценарий, в котором у вас будет одна дополнительная служба, обрабатывающая аутентификацию и предоставляющая маркер безопасности, который будет использоваться для аутентификации в вашем приложении ASP.NET и вашей службе WCF.Я думаю, что OAuth должен справиться и с этим сценарием.

0 голосов
/ 21 января 2012

Я предлагаю вам использовать wsHttpBinding с защитой сообщений на основе сертификатов. Посмотрите пошаговое руководство здесь: http://www.codeproject.com/Articles/28248/Securing-WCF-Services-with-Certificates (это для Windows Server 2003, но процедура на новых серверах не сильно отличается)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...