WCF ServiceSecurityContext Право хранения пользовательских данных?
У меня есть приложение WCF, которое использует проверку подлинности Windows. Итак, объект Windows Principal - это то, что я найду в свойстве System.Threading.Thread.CurrentPrincipal(). Это все в порядке. Однако у меня также есть пользовательский основной объект, который используется для более детальных авторизаций и аудита. Это пользователь домена, а не пользователь Windows. Мне действительно нужно и то, и другое, и я ищу место для хранения пользовательского пользователя на стороне службы, чтобы весь код, выполняемый в службе, вплоть до уровней Business и Data, мог получить доступ к этому пользователю.
Связь между клиентом и сервером обрабатывается пользовательским поведением и инспектором сообщений. При вызове службы из клиента (веб-приложение ASP.NET) он получает текущего пользователя из сеанса и сериализует его в настраиваемый заголовок вызова службы. На стороне службы он затем удаляет принципала из заголовка и помещает пользовательский принципал сюда:
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")
Итак, вопросы для проверки этого подхода:
- Это правильный подход к хранению пользовательского участника на службе. Помня, я хочу, чтобы аутентификация Windows оставалась на месте.
- Это "лучшая практика"? Или есть лучший способ?
- Есть ли ловушки или ловушки, на которые стоит обратить внимание при таком подходе?
Спасибо за вклад.
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...
}