Аутентификация WCF с учетными данными в теле сообщения - PullRequest
1 голос
/ 26 сентября 2011

Я разрабатываю веб-сервис , который должен соответствовать спецификации WSDL, требуемой данным приложением, и в котором каждый запрос SOAP содержит имя пользователя и пароль в чистом, простом тексте (я знаю, что это довольно плохая идея, но это был не мой выбор дизайна).Теперь я должен аутентифицировать каждый вызов методов моей службы, сверяя эти учетные данные с базой данных действительных учетных данных.Я слышал о WCF UserNamePasswordValidator, но, насколько я понял, это применимо, только если учетные данные передаются через заголовки SOAP, а это не так.Какие у меня есть варианты?

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

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

Если у вас есть имя пользователя и пароль, отправленные в виде открытого текста по проводу внутри вашего мыльного тела, просто используйтеинформация для проверки вашего экземпляра базы данных вручную.Возьмите имя пользователя и пароль и проверьте его (или его хэши MD5) с помощью SQL-запроса, возвращая строку только тогда, когда значения найдены в базе данных.Когда строка возвращается, вы знаете, что пользователь аутентифицирован.

0 голосов
/ 07 июня 2012

Какие у меня есть варианты?

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

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

Таким образом, здесь может быть типичная конфигурация (некоторые другие конфигурации оставлены для краткости):

<behaviors>
  <serviceBehaviors>
    <behavior name="MySvcBehavior">
      <serviceAuthorization serviceAuthorizationManagerType="MyWCFService.CustomAuthorizationManager, MyWCFService" />
    </behavior>
  </serviceBehaviors>
<behaviors>

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

public class CustomAuthorizationManager : ServiceAuthorizationManager
{

    protected override bool CheckAccessCore(OperationContext operationContext)
    {

        IIdentity primaryIdentity = operationContext.ServiceSecurityContext.PrimaryIdentity;
        if (primaryIdentity.Name == "user1")
        {
            return true;
        }
        else
        {
            return false;
        }

    }

}

Вот некоторые примечания, в частности из моего кода, составленного из MSDN: Инфраструктура модели идентификации в Windows Communication Foundation (WCF) поддерживает расширяемую модель авторизации на основе утверждений. Заявки извлекаются из токенов и, необязательно, обрабатываются пользовательскими политиками авторизации, а затем помещаются в AuthorizationContext. Менеджер авторизации проверяет утверждения в AuthorizationContext для принятия решений об авторизации. По умолчанию решения об авторизации принимаются классом ServiceAuthorizationManager; однако эти решения могут быть отменены путем создания собственного диспетчера авторизации. Чтобы создать пользовательский менеджер авторизации, создайте класс, производный от ServiceAuthorizationManager (этот класс), и реализуйте метод CheckAccessCore (выполненный в этом классе). Решения об авторизации принимаются в методе CheckAccessCore, который возвращает «true», когда доступ предоставлен, и «false», когда доступ запрещен.

Вот (2) дополнительные ссылки, которые подтверждают это. Первый - это ссылка MSDN, использующая утверждения в методе. Просто помните, что вы можете сделать все, что вам нужно в пределах CheckAccessCore. Это просто требует к концу возвращения true или false. Вторая ссылка - одна из моего блога, где у меня есть полная реализация, но с использованием аутентификации Windows. Еще раз, детали для вас будут проверять тело сообщения, чтобы получить необходимые детали в рамках этого CheckAccessCore метода.

Как: создать собственный диспетчер авторизации для службы:
http://msdn.microsoft.com/en-us/library/ms731774.aspx

Как: создать политику аутентификации Windows в стиле ASP.NET для служб WCF:
http://allen -conway-dotnet.blogspot.com / 2010/01 / как к созданию-записи ASPNET-windows.html

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