WCF ServiceSecurityContext Право хранения пользовательских данных?

У меня есть приложение WCF, которое использует проверку подлинности Windows. Итак, объект Windows Principal - это то, что я найду в свойстве System.Threading.Thread.CurrentPrincipal(). Это все в порядке. Однако у меня также есть пользовательский основной объект, который используется для более детальных авторизаций и аудита. Это пользователь домена, а не пользователь Windows. Мне действительно нужно и то, и другое, и я ищу место для хранения пользовательского пользователя на стороне службы, чтобы весь код, выполняемый в службе, вплоть до уровней Business и Data, мог получить доступ к этому пользователю.

Связь между клиентом и сервером обрабатывается пользовательским поведением и инспектором сообщений. При вызове службы из клиента (веб-приложение ASP.NET) он получает текущего пользователя из сеанса и сериализует его в настраиваемый заголовок вызова службы. На стороне службы он затем удаляет принципала из заголовка и помещает пользовательский принципал сюда:

OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")

Итак, вопросы для проверки этого подхода:

  1. Это правильный подход к хранению пользовательского участника на службе. Помня, я хочу, чтобы аутентификация Windows оставалась на месте.
  2. Это "лучшая практика"? Или есть лучший способ?
  3. Есть ли ловушки или ловушки, на которые стоит обратить внимание при таком подходе?

Спасибо за вклад.

1 ответ

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

Вот пример вызова службы WCF от клиента

MyAccountService.MyAccountServiceClient client = new MyAccountServiceClient();
using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
{
    MessageHeader customHeader = MessageHeader.CreateHeader("customData", "ns", "My custom data");
    OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);

    List<Bill> list = client.BillHistory("12345", DateTime.Now.AddMonths(-1), DateTime.Now);
}

На стороне сервиса вы можете проверить заголовки входящих сообщений.

public IList<Bill> BillHistory(string accountID, DateTime datefrom, DateTime dateTo)
{
    string customData = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("customData", "ns");
...etc...
}
Другие вопросы по тегам