Защита именованного канала, используемого WCF - PullRequest
5 голосов
/ 26 февраля 2011

новичок в WCF и именованных каналах.

Мне нужен способ безопасной связи между приложением пользовательского интерфейса и службой Windows на одном компьютере. Вот что мне нужно: - Клиентское приложение должно отправлять (отправлять) сообщения различных типов в службу Windows. - Потребности приложения клиентского интерфейса будут получать различные типы сообщений от службы (нажатие или извлечение).

(сообщение здесь представляет собой просто структурированные сериализованные данные).

Теперь весь этот обмен должен происходить только под учетной записью авторизованного пользователя (которая может отличаться от учетной записи службы). Поэтому я думал о ACLing именованного канала для службы и учетной записи пользователя.

Однако именованный канал поддерживает только потоки. У меня есть несколько типов сообщений, которые необходимо обмениваться по именованному каналу, что означает, что мне нужно определить их и сериализовать / десериализовать их.

Чтобы обойти это, я подумал об использовании WCF (для сериализации и поддержки RPC) по именованным каналам. Также разместите службу WCF в службе Windows.

Вопрос 1) Это хороший подход? Я сомневаюсь в использовании http или tcp ниже WCF, поскольку связь должна оставаться внутри машины.

Вопрос 2) Если и как я могу ACL именованный канал, который WCF будет использовать? Это то, что я могу контролировать? Я чувствую, что ACL для именного канала с определенными идентификаторами безопасности обеспечивает мне большую безопасность, в отличие от реализации схемы аутентификации между клиентом и сервером.

Спасибо за любые указатели, предложения! Самир

Ответы [ 3 ]

8 голосов
/ 27 февраля 2011

1) Я думаю, что это хороший подход.Ваше мышление сосредоточено.

2) Как вы, кажется, уже обнаружили, мой пост здесь показывает вам один из способов установить ACL для канала , созданного привязкой WCF NetNamedPipe.Он включает в себя использование отражения, чтобы заполнить пробел в реализации Microsoft, которая изначально была предназначена для поддержки прямого механизма настройки ACL, но не была завершена должным образом.

Получите AclSecuredNamedPipeBinding из CustomBinding и соответствующий AclSecuredNamedPipeTransportBindingElement из NamedPipeTransportBindingElement.Элемент привязки имеет список SecurityIdentifier:

internal List<SecurityIdentifier> AllowedUsers { get { return _allowedUsers; } }
private List<SecurityIdentifier> _allowedUsers = new List<SecurityIdentifier>();

Метод BuildChannelListener<TChannel>(BindingContext) переопределяется для установки частного свойства AllowedUsers:

public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
  private static Type namedPipeChannelListenerType 
          = Type.GetType("System.ServiceModel.Channels.NamedPipeChannelListener, System.ServiceModel", false);
  IChannelListener<TChannel> listener = base.BuildChannelListener<TChannel>(context);
  PropertyInfo p = namedPipeChannelListenerType.GetProperty(
          "AllowedUsers", BindingFlags.Instance|BindingFlags.NonPublic);
  p.SetValue(listener, _allowedUsers, null);
  return listener;
}

Если вы пойдете этим путем, обязательно исправьте «уязвимость приседания», как объяснено в более позднем посте .

3 голосов
/ 26 февраля 2011
0 голосов
/ 26 октября 2017

Я попробовал то, что предложено выше в "блоге Криса Диссона", но после запуска служебного кода в привилегии администратора получил ниже исключение «Существует проблема с StudentService. Некоторые или все идентификационные ссылки не могут быть переведены». вот мой код, на котором размещен сервис

AclSecuredNamedPipeBinding binding = new AclSecuredNamedPipeBinding();
SecurityIdentifier allowedGroup = (SecurityIdentifier)(new 
NTAccount("NPServiceUsers").Translate(typeof(SecurityIdentifier)));
binding.AddUserOrGroup(allowedGroup);
studentServiceHost = new ServiceHost(typeof(StudentService.StudentService));
Uri httpBaseAddress = new 
Uri("net.pipe://localhost/ServiceHost/ServiceHost");

studentServiceHost.AddServiceEndpoint(
typeof(StudentService.IStudentService),binding, httpBaseAddress); 
studentServiceHost.Open();

Затем я попытался изменить nTAccount с "NPServiceUsers" на "Администраторы", после чего я получил исключение ниже *.

"Существует проблема с ссылкой на объект StudentService, не установленной для экземпляра объекта."

studentService - это класс, в котором реализован интерфейс IStudentService.

public class StudentService : IStudentService
{
public void DoWork()
{
}
}
...