Как поставить пароль на сервис WCF? - PullRequest
6 голосов
/ 04 марта 2011

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

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

Edit:

Идея состоит в том, чтобы проходить аутентификацию с помощью моего программного обеспечения, без необходимости входа пользователя.

Ответы [ 7 ]

3 голосов
/ 27 марта 2012

Другой вариант - реализовать собственную безопасность. Вот базовый пример.

WCF Сервис

В вашем сервисе измените ServiceBehavior InstanceContextMode на PerSession и ConcurrencyMode на Single

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
public class SomeService : ISomeService
{ 
    // ...
}

Добавьте к вашим услугам свойства Username и Password.

public string UserName { [OperationContract] get; [OperationContract] set; }
public string Password { [OperationContract] get; [OperationContract] set; }

Добавить приватный метод проверки безопасности.

public void CheckSecurity()
{
    if ((this.UserName == null || this.Password == null) ||
        this.UserName == "username" && this.Password == "password"))
    {
        throw new FaultException("Unknown username or incorrect password.");
    }
}

Затем вызовите метод CheckSecurity в каждой службе конструктор класса метод.

public SomeServiceMethod1()
{
    this.CheckSecurity();

    // some method codes
}

Клиентское приложение

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

Вы также можете попробовать использовать шифрование в имени пользователя и пароле для повышения безопасности.

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

1 голос
/ 04 марта 2011

Вы можете использовать поставщика членства ASP.NET для аутентификации клиентов. На MSDN есть статья, описывающая, как этого добиться .

0 голосов
/ 27 марта 2012

Что вам нужно, так это реализовать пользовательскую проверку пароля.Вот хорошие статьи об этом: UserNamePasswordValidator и CodeProject .

Мы используем то же самое в нашем проекте, но вместо имени пользователя используется ключ API.Пароль может быть любым в этом случае.

0 голосов
/ 08 марта 2011

Аутентификация программного обеспечения, которое генерирует запросы к сервису, по своей сути является очень сложной проблемой, гораздо более сложной, чем аутентификация пользователя-человека.Проблема возникает из-за необходимости хранить секретную информацию, которая будет использоваться для создания учетных данных, отправляемых в качестве основы для аутентификации.

При аутентификации пользователя-пользователя вы можете рассчитывать на то, что он сможет сохранить секрет (например, ПИН-код или пароль) в хранилище данных (влажное серое вещество между их ушами), к которому имеют доступ только они.

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

Доступны только следующие варианты:

  • Найдите способ предоставить программное обеспечение для секретного хранилища во время выполнения, например смарт-карту с защитой PIN-кодом, которую необходимо использовать вместе сваше клиентское приложение.
  • Положитесь на безопасность, не зная, признавая, что это может сделать подделку лишь более трудной и более трудоемкой для злоумышленника, но не победит того, кто решил нарушить вашу схему аутентификации.
0 голосов
/ 04 марта 2011

Есть много способов справиться с этим сценарием.

Ответы Фредрика и Стефана вместе могут дать метод аутентификации и авторизацию (через токен), но вам придется написать страницу входа в систему, БД, код, проверки,принудительное применение, создание токенов, встраивание токенов и логика проверки токенов самостоятельно.

Предложение PaulF, вероятно, является менее трудоемким, поскольку вы можете использовать функции, встроенные в WCF, для переноса учетных данных в транспорте сообщений.Могут пропустить логику создания токена, встраивания токена и проверки токена.

Если вы планируете поддерживать много разных устройств, я бы порекомендовал изучить OpenID, Windows Identity Foundation, службу аутентификации Azure и т. Д. - это немногосложнее в настройке, но обеспечивает надежный, основанный на стандартах и ​​гибкий способ передачи учетных данных.Пассивная Федерация - хорошее ключевое слово, если вы хотите пойти по этому пути.

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

0 голосов
/ 04 марта 2011

Все ответы ниже хороши, но это будет зависеть от того, кто потребляет вашу службу WCF.

Например, я знаю службу WCF, которая используется приложением iPhone через REST, и некоторые схемывыше было бы очень сложно, если не невозможно реализовать.Он использовал нечто похожее на решение Стефана о ключе сеанса, переданном в заголовке сообщения.

0 голосов
/ 04 марта 2011

Безопасность никогда не бывает простой. Для ваших требований взгляните на UserNamePasswordClientCredential и UserNamePasswordServiceCredential . Их может быть достаточно.

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