Передать имя пользователя и пароль в XML-запрос к сервису wcf для аутентификации? - PullRequest
3 голосов
/ 12 мая 2011

У меня есть служба wcf, в которой пользователю необходимо будет пройти проверку подлинности, прежде чем он сможет выполнить вызов службы. Не будет веб-сайта, на котором пользователь будет подтвержден через логин или приложение windows / console, где пользователь будет проверен. Я думал сделать что-то вроде этого:

Пропустить в запросе:

<GetCars>
    <Credentials username="test" password="test" />
</GetCars>

Если имя пользователя и пароль введены успешно, верните успешный ответ для GetCars, иначе произойдет сбой.

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

1 Ответ

6 голосов
/ 12 мая 2011

Вскоре я попытаюсь описать метод, который я использую в своей собственной службе WCF для аутентификации.Существует встроенная обработка аутентификации с конечными точками WCF SOAP с использованием спецификации WS-Security (т. Е. wsHttpBinding, как вы используете).Вы можете реализовать настройки в файле web.config следующим образом:

<bindings>
  <wsHttpBinding>
    <binding name="myBindingName">
      <security mode="Message">
        <transport clientCredentialType="None" />
        <message clientCredentialType="UserName" />
      </security>

Затем вы можете указать пользовательский тип для обработки логики аутентификации:

<behaviors>
  <serviceBehaviors>
    <behavior name="myBehaviorName">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="NameSpaceName.Class,AssemblyName" />
      </serviceCredentials>

Этот класс, который обрабатывает логику аутентификации, должен расширятьсяUserNamePasswordValidator (для этого нужно сослаться на System.IdentityModel.dll и импортировать System.IdentityModel.Selectors) и переопределить Validate:

public class MyValidator : UserNamePasswordValidator {
    public override void Validate(string userName, string password) {
        // check password. if success, do nothing
        // if fail, throw a FaultException
    }
}

Для вызова этого кода с использованием клиента ASP.Net WCF необходимо использовать ClientCredentialпередать имя пользователя и пароль следующим образом:

// This pattern needs to be repeated and username / password set with every creation
// of a client object.  This can be refactored to a separate method to simplify.
MyAPIClient client = new MyAPIClient();

// yes UserName is there twice on purpose, that's the proper structure
client.ClientCredentials.UserName.UserName = theUsername;
client.ClientCredentials.UserName.Password = thePassword;

try {
    client.Open();
    client.DoSomething();
    client.Close();
} catch (Exception ex) {
    // handle exception, which should contain a FaultException;
    // could be failed login, or problem in DoSomething
}

Очевидно, что привязка и поведение, определенные выше, должны быть назначены самой службе с использованием свойств behaviorConfiguration и bindingConfiguration.

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