WCF 4.0 REST аутентификация по имени пользователя по паролю - PullRequest
7 голосов
/ 19 сентября 2011

Я боролся с аутентификацией / авторизацией по имени / паролю в службе WCF 4.0 RESTfull с использованием провайдеров членства / роли ASP.Net.

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

Может ли кто-то быть добрым, чтобы

  1. Дайте авторитетное представление о том, является ли WCF 4.0 + REST хорошей идеей для начала?
  2. Укажите общепринятые шаги для этого (или ссылки).
  3. Предоставьте достаточно полный пример кода, необходимого для этого.

Edit: Награда для всех, кто может предоставить полный образец (или даже просто ссылку на полный образец) с аутентификацией и авторизацией по имени пользователя и паролю для службы RESTfull WCF 4.0 с использованием шаблона приложения службы WCF в VS 2010.

Ответы [ 4 ]

10 голосов
/ 05 октября 2011

Я думаю, что ответ на ваш вопрос зависит от цели вашего сервиса и типа приложений, которые будут его использовать.

Если у вас есть приложение ASP .Net, и вы хотите выставитьчасть его функциональности как службы RESTfull, которую вы могли бы использовать на стороне клиента, используя AJAX, тогда WCF может оказаться не лучшим вариантом.В этом конкретном случае у вас уже есть пользователь аутентификации внутри веб-приложения, и вы хотите, чтобы эта аутентификация распространялась во время вызовов AJAX.Реализовать это на самом деле довольно просто.

Аутентификация ASP .Net Forms основана на аутентификационных cookie-файлах, которые генерируются и передаются в браузер после успешного входа в систему.Каждый вызов, сделанный из браузера на любой URL в том же домене, что и ваше приложение, также будет содержать файл cookie для аутентификации.В ASP .Net MVC вы можете просто реализовать свои методы обслуживания как действия контроллера, которые требуют авторизации, и все произойдет за вас.

В классическом ASP .Net вы можете использовать PageMethods для реализации методов обслуживания и сновакуки будут отправлены и проверены для вас за кадром (примеры PageMethods здесь и здесь ).

С другой стороны, если ваша служба будетпотребляемый вне браузера (например, из настольных или мобильных приложений), WCF действительно может быть подходящим инструментом для реализации сервиса.Однако проверка подлинности на основе форм ASP .Net - не лучший выбор для обеспечения безопасности.Основное назначение служб REST - это простота, позволяющая легко внедрять клиенты на любой платформе, а механизм проверки подлинности форм ASP .Net на основе файлов cookie не самый простой.

Один протокол, специально созданный для проверки подлинности пользователя.в контексте веб-сервисов, это OAuth.Его вторая версия все еще находится в стадии разработки (см. Спецификации здесь ), но, скорее всего, вы захотите использовать эту версию, поскольку она намного проще, чем OAuth 1.0.Facebook уже внедрил свою API-аутентификацию через OAuth 2.0 (подробности здесь ), и вы можете проверить их реализацию на предмет вдохновения.

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

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

string Login(string user, string password);

При успешном входе в систему указанный выше метод вернет маркер аутентификации.Токен аутентификации будет затем использован и проверен на всех других методах.Например:

Employee[] GetAllEmployees(string authToken)
{
  // verify token here

  // return data if user authenticated by token
}

В приведенной выше архитектуре authToken выполняет ту же роль, что и cookie-файл аутентификации в ASP .Net-аутентификации форм, но передается как простой параметр.Вы будете нести ответственность за реализацию алгоритма генерации токенов (они должны быть достаточно длинными и уникальными, с алгоритмом вроде здесь ), а также за их хранение и проверку.

2 голосов
/ 19 сентября 2011

WCF Web Api очень упрощает написание службы WCF Rest, однако она имеет ограничения. Для аутентификации вам нужно использовать WCF Rest Contrib

Если вы хотите получить максимальный контроль над дизайном службы, вам следует вернуться к ASP.NET MVC и написать методы контроллера для каждого метода службы.

1 голос
/ 02 февраля 2013

Одним из подходов является использование безопасного ключа. и токен

  1. У каждого клиента есть безопасный ключ , который он отправляет по первому запросу, наверное в шапке.
  2. Вы можете сгенерировать ключ как ключ = MD5Hash (имя пользователя + пароль);
  3. В ответ он получает токен , затем токен отправляется в каждый запрос. Токен может быть Guid. Срок действия каждого токена истекает через x мин.
  4. На стороне сервера вы можете поддерживать одноэлементный словарь, такой как Dictionay, для проверки истечения токена, когда текущее время> время истечения удаляет его из словаря.
  5. Чтобы продлить сеанс, вставьте метод возобновления сеанса в свой код.

Для обеспечения безопасности потока

Имейте пару секретного / открытого ключа, клиент зашифрует все данные поста, используя открытый ключ, и вы расшифруете, используя закрытый ключ.

0 голосов
/ 01 октября 2011

Вот пример, сделанный с asp.net mvc

Когда я звоню http://localhost:57322/Test/SecureMethod/, я получаю ошибку.Однако, если я сначала позвоню http://localhost:57322/Test/Login?username=test&password=abc, то исходный URL вернет верный результат.

namespace MvcApplication1.Controllers
{
    public class TestController : Controller
    {
        public ActionResult Login(string username, string password)
        {
            if (username=="test" && password == "abc")
            {
                FormsAuthentication.SetAuthCookie(username, true);
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            return Json(false, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        public ActionResult SecureMethod()
        {
            return Json("Hello world",JsonRequestBehavior.AllowGet);
        }

    }
}

Если у вас уже написано .svc, но они не сделаны через MVC, вы можете поместить их в любую папку.Защищено через web.config, а затем просто используйте метод входа в систему выше, чтобы войти в систему, прежде чем делать какие-либо безопасные вызовы.

...