Безопасность WCF с функциональными группами AD - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть служба WCF, работающая в качестве службы Windows в интрасети, и мне нужно проверить, принадлежат ли пользователи, обращающиеся к службе, к определенным функциональным группам AD. Это довольно просто. Я могу вызвать метод, украшенный [OperationContract], который делает это. Однако можно ли принудительно выполнять эту проверку каждый раз, когда создается экземпляр службы? Я пытался вызвать метод в конструкторе службы, но это не сработало.

Мой клиент - приложение WinForms, и я выполняю эту проверку безопасности, когда конструктор основной формы не очень хорош. Я хотел бы избежать жесткого кодирования имен функциональных групп в атрибутах, поскольку функциональные группы могут измениться, и я хотел бы, чтобы они были указаны в файле app.config службы WCF.

Я не согласен с .NET 3.0.

Спасибо

Ответы [ 3 ]

0 голосов
/ 29 декабря 2009

Я реализовал ServiceAuthorizationManager для обработки авторизации. Однако, кажется, я не могу получить доступ к Active Directory в момент вызова методов ServiceAuthorizationManager. Thread.CurrentPrincipal.Identity.Name моего сервиса пуст. Я подозреваю, что это будет использоваться в качестве учетных данных, когда я запрашиваю AD. Если я попытаюсь сделать запрос AD после того, как мой класс обслуживания будет создан, он будет работать, и Thread.CurrentPrincipal.Identity.Name заполнится правильно. Проблема в том, что мне придется выполнять проверку в каждом методе [OperationContract], который просто не выглядит правильным.

0 голосов
/ 21 января 2012

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

    public static void CheckPermissions(List<string> RequiredGroupNames)
    {
        bool ThrowException;
        WindowsIdentity MyIdentity = OperationContext.Current.ServiceSecurityContext.WindowsIdentity;
        WindowsPrincipal p = new WindowsPrincipal(MyIdentity);
        ThrowException = true;
        foreach (string RequiredGroupName in RequiredGroupNames)
        {
            if (p.IsInRole(RequiredGroupName))
            {
                ThrowException = false;
            }
        }
        if (ThrowException == true)
        {
            throw new FaultException(MyIdentity.Name + ": You don't have permission for this operation!");
        }
    }

Я использовал .NET 4.0, а не 3.0, как указано в OP. Но я надеюсь, что кто-то может найти это полезным.

0 голосов
/ 16 декабря 2009

По умолчанию, служба WCF будет либо за вызов, либо за сеанс, в зависимости от вашего bdingin. Рекомендуемая рекомендация - для каждого звонка, и в этом случае каждый запрос будет:

  • получает свой собственный совершенно новый отдельный экземпляр класса обслуживания
  • будет создан экземпляр класса обслуживания
  • будет вызван соответствующий сервисный метод, включая все проверки авторизации в контексте операции
  • ответ будет возвращен звонящему
  • класс обслуживания будет ликвидирован

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

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class YourServiceImplementation : IYourServiceContract
{
  ...
}

Подробнее о теме здесь:

Откройте для себя мощные методы управления экземплярами для разработки приложений WCF

...