Услуги WCF: передача токена для проверки подписки и получения информации о базе данных. - PullRequest
2 голосов
/ 24 января 2010

Я создаю умное клиентское приложение с использованием .NET 3.5. Клиент Winforms, подключающийся через службы WCF для извлечения данных из SQL Server 2008. Мне нужно передать имя пользователя / пароль (в зашифрованном виде и через HTTPS) и вернуть информацию, такую ​​как:

  • Является ли этот пользователь (адрес электронной почты) в рамках текущей подписки
  • К какому серверу мы должны перейти на следующий для всех последующих вызовов (плохая балансировка нагрузки)
  • Какой сервер / базу данных следует использовать в строке подключения (учетные данные не требуются), поскольку люди могут использовать разные базы данных в зависимости от своей подписки и т. Д.

Таким образом, мой первый вызов при входе в систему отправляет учетные данные, которые выполняется поиск. Сериализуемый класс будет использоваться для создания объекта токена (я предполагаю, что это способ справиться с этим), который будет возвращать истечение срока действия, информацию о сервере, информацию о базе данных.

Вопрос заключается в том, чтобы при всех последующих вызовах передавать этот токен в качестве параметра для каждого контракта на обслуживание (веб-метод) или я могу оставить все свои текущие контракты как есть и передать токен в заголовке или каким-либо другим более универсальным методом?

Как вы предлагаете внедрить систему токенов, такую ​​как я описал?

Спасибо

1 Ответ

1 голос
/ 24 января 2010

Для одного я бы только вернул TokenID - некоторый уникальный идентификатор, чтобы четко идентифицировать пользователя и его подписку, о которой идет речь - из вашего первого звонка "аутентификации". Не нужно все время отправлять туда-сюда весь набор информации - эти данные нужны только службе на стороне сервера, поэтому вы можете оставить эту информацию на сервере и обращаться к ней только в коде своего сервера, когда это необходимо.

Так что этот первый вызов - вызов аутентификации - скорее всего, проверяет учетные данные, отправляемые по таблице базы данных, по таблице подписки, а затем помещает эту информацию (кто звонит, на основании какой подписки) и, возможно, какой-то дата / время истечения срока действия в таблицу «Действительных абонентов» и сгенерированный из нее идентификатор (GUID или что-то). Возможно, вы захотите ограничить «срок службы» TokenID - например, он действителен в течение 30 минут или около того - поэтому он не может быть взломан и постоянно использоваться после первого успешного вызова. Этот сгенерированный GUID затем возвращается как TokenID из вызова аутентификации и может использоваться в качестве идентификатора в каждом последующем вызове.

Такие вещи, как то, какой сервер баз данных использовать, на самом деле не имеют места в сообщениях, идущих туда и обратно - они строго важны для кода обслуживания на стороне сервера - просто оставьте это там!

Это определенно предпочтительная практика - помещать такую ​​«метаинформацию», которая не является реальной информацией о ваших звонках, в заголовки и искать ее там. WCF поддерживает это довольно легко и просто - либо с помощью инспекторов сообщений ( образец для этого здесь и здесь ) на стороне клиента и службы, либо с помощью OperationContextScope (пример * сообщение в блоге ) здесь и здесь ) - оба прекрасно работают.

...