Аутентификация в сервисе WCF - PullRequest
3 голосов
/ 31 августа 2009

У меня служба WCF развернута на другом компьютере, и я хочу аутентифицировать клиента по службе WCF.

Я сделал следующие вещи:

1) В IIS я снял флажок «Анонимный доступ» и установил флажок «Встроенная проверка подлинности Windows».

2) Мой веб-конфиг

 <authentication mode="Windows" />
 <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBind">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

3) На стороне клиента я передаю учетные данные пользователя, как показано ниже:

MyServiceClient _client;

_client = new MyServiceClient();

_client.ClientCredentials.Windows.ClientCredential.UserName = "username";
_client.ClientCredentials.Windows.ClientCredential.Password = "password";
_client.ClientCredentials.Windows.ClientCredential.Domain = "mydomain";

Мой вопрос: как мне перехватить имя пользователя и пароль на стороне сервера (где развернута служба)?

Как я могу аутентифицировать пользователя по переданным учетным данным?

В настоящее время я использую привязку basichttp .. достаточно ли это связывание для поддержки модели безопасности?

Ответы [ 2 ]

6 голосов
/ 31 августа 2009

На стороне сервера вы можете либо пройти аутентификацию в Active Directory, используя передаваемые учетные данные Windows, либо вам потребуется альтернативное хранилище для обработки аутентификации пользователя.

Вы можете получить доступ к идентификатору вызывающего абонента в коде на стороне сервера, используя:

IIdentity caller = ServiceSecurityContext.Current.PrimaryIdentity;

Вы также можете проверить, звонил ли пользователь Windows со своими учетными данными Windows (как в вашем примере), проверив

ServiceSecurityContext.Current.WindowsIdentity

Если значение равно NULL, учетные данные Windows не были переданы - в противном случае вы можете использовать эту идентификационную информацию Windows, чтобы проверить, кто звонит (имя и т. Д.), - однако вы не сможете прочитать пароль пользователя! Вы можете проверить его имя, к каким группам он принадлежит и многое другое.

Чтобы использовать проверку Windows / Active Directory, установите clientCredentialType на «Windows». Возможно, вам придется переключиться на wsHttpBinding или, что еще лучше: netTcpBinding (если вы находитесь в локальной сети Windows за брандмауэром).

<bindings>
  <netTcpBinding>
    <binding name="WindowsSecured">
      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>

При этом только пользователи, зарегистрированные в вашем домене Windows, могут вызывать эту службу. Любым другим пользователям будет отказано без дополнительной работы с вашей стороны.

Как только пользователь звонит из Windows, вы можете проверить ServiceSecurityContext.Current.WindowsIdentity для получения информации о том, кто звонит.

Проверьте документы MSDN для получения подробной информации о том, что доступно в контексте безопасности службы, или идентификатор Windows .

Марк

0 голосов
/ 31 августа 2009

Похоже, вам нужен пользовательский валидатор имени пользователя и пароля. Существует статья MSDN, которая охватывает все этапы: Как: использовать пользовательский валидатор имени пользователя и пароля .

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

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