Веб-службе WCF необходим доступ к информации об имени пользователя и пароле - PullRequest
0 голосов
/ 19 декабря 2011

Я создал веб-службу wcf, которая просто предоставляет данные MS Dynamics SQL для приложения Silverlight, размещенного на CRM. В настоящее время веб-службы размещены в IIS и доступны только через HTTPS, поэтому содержимое сообщений является безопасным. Теперь я готов реализовать следующий уровень безопасности, связанный с тем, кто вошел в клиентское приложение Silverlight. Я хотел бы передать эту информацию веб-службе, а затем использовать ее при создании объекта подключения к SQL Server. В результате база данных MS Dynamics будет возвращать только те данные, которые подключенный пользователь имеет право просматривать.

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

Для уточнения: Приложение Silverlight собирает имя пользователя и пароль от пользователя при входе в приложение. Это информация, которая в конечном итоге должна использоваться веб-службой, когда веб-служба устанавливает соединение с базой данных SQL Server. Поэтому моя цель состоит в том, чтобы приложение Silverlight передавало имя пользователя и пароль веб-службе таким образом, чтобы веб-служба могла получить его и использовать при создании объекта Connection.

Я рассматриваю что-то такое простое, как добавление имени пользователя и пароля к каждому запросу веб-службы. Однако я предпочел бы использовать стандартный метод для передачи учетных данных пользователя, но я не могу найти какой-либо способ получить пароль. Имя пользователя доступно через OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name.

Есть идеи?

1 Ответ

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

Вы можете использовать wsHttpBinding для передачи учетных данных в вашу службу, однако это по крайней мере потребует от вас отправки учетных данных с защитой сообщений.Вы можете объединить это с анонимной аутентификацией в IIS.Таким образом, каждый может получить доступ к службе на транспортном уровне, но вы сможете обрабатывать учетные данные самостоятельно.

Для расширения у меня есть служба WCF, работающая в IIS с HTTPS и анонимной аутентификацией.В моем файле web.config я настроил wsHttpBinding, например:

<bindings>
<wsHttpBinding>
    <binding name="CredentialsBinding" />
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

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

<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehavior">
      <serviceCredentials>
        <userNameAuthentication
        userNamePasswordValidationMode="Custom"
       customUserNamePasswordValidatorType="MyNamespace.CredentialValidator, MyNamespace"/>
      </serviceCredentials>
       </behavior>
  </serviceBehaviors>
</behaviors>

Валидатор выглядит следующим образом:

namespace MyNamespace.CredentialValidator
{
    public class CredentialValidator:  UserNamePasswordValidator 
    {
        public override void Validate(string userName, string password)
        {
            // you can now handle the username and password passed to your service
            // with a wsHttpBinding through HTTPS
        }
    }
}

- EDIT

Рори Примроуз описывает то, что вы, вероятно, ищете в своей статье Безопасность WCF: Получениепароль пользователя , используя CustomUserNameSecurityTokenAuthenticator для получения пароля для дальнейшего использования.

...