Используя сервис WCF, как я могу проверить действия пользователя приложения? - PullRequest
1 голос
/ 27 января 2012

Я реализую трехуровневое приложение. Я использую WCF в качестве слоя обслуживания / BLL. При вызове сервиса моя аутентификация разрешает доступ к определенной учетной записи домена, предотвращая нежелательный трафик и поддерживая только одну учетную запись для приложения.

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

Например, мой пользователь приложения, назовем его Боб, обновляет заказ на покупку. Приложение вызывает метод UpdatePO () в моей службе, используя идентификатор пользователя / пароль, специфичные для этого приложения. Приложение авторизовано. Теперь обновление может произойти. При выполнении обновления мне нужно убедиться, что Боб может выполнить действие, и зарегистрировать его в моей базе данных.

Мне нужно будет делать это практически с любыми вызовами службы обновлений и даже с некоторыми вызовами чтения. Я не хочу передавать параметр с каждым методом, если это возможно. Есть ли способ передать второй набор учетных данных службе, которая будет использоваться в качестве моих учетных данных?

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

Ответы [ 2 ]

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

Вы можете использовать MessageHeaders для этого.

От клиента

var auditHeader = new MessageHeader<string>("Bob");
var proxy = new MyClient();
using(var contextScope = new OperationContextScope(proxy.InnerChannel)){
  OperationContext.Current.OutgoingMessageHeaders.Add(
                                  auditHeader.GetUntypedHeader("string","System"));
   proxy.MyMethod();
}
proxy.Close();

На сервере

class MyService : IMyContract{
   public void MyMethod()   {
      var who = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("string","System");
      // use it ...
   }
}
0 голосов
/ 27 января 2012

Пара предложений:


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

Подробнее о реализации см. в этой статье MSDN .


Вы можете сделать так, чтобы все ваши методы принимали 1 параметр; некоторый базовый класс Message, который содержит учетные данные пользователя и расширяет его для каждого конкретного типа сообщения.

В коде:

[DataContract]
public class MessageBase {
    [DataMember]
    public string UserName { get; set; }
    [DataMember]
    public string UserPassword { get; set; }
}

[DataContract]
public class UpdatePOMessage : MessageBase {
}

[OperationContract]
public void UpdatePO(UpdatePOMessage message) { /* do work */ }

Затем вы можете реализовать пользовательскую IOperationInvoker или другую точку расширения WCF, которая просматривает параметр метода, удостоверяется, что он реализует MessageBase, и, если это так, проверяет и проверяет учетные данные.


IMO 2-й способ немного более "хакерский". В моем последнем производственном приложении мы делаем 1-й вариант ... передаем полный пользовательский токен безопасности от клиента вместо встроенных типов безопасности WCF. На самом деле у меня есть длинный вопрос StackOverflow, который я задал, когда у меня были проблемы с ним, здесь .

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