Аутентификация запросов REST в MVC 2

Привет, ТАК, за последние несколько часов я пытался разобраться в службах RESTful, которые можно обслуживать через asp.net MVC. Аутентификация по-прежнему не рассматривается во всех учебниках и руководствах, которые я находил в Интернете.

В настоящее время мы используем аутентификацию на основе форм в нашем существующем приложении MVC. Насколько я понимаю, нам нужно добавить базовую HTTP-аутентификацию, чтобы иметь возможность обрабатывать запросы REST и разрешения пользователей, связанные с контекстом пользователя. Есть ли способ «смешать» эти два режима аутентификации в одном приложении?


person schwindelig    schedule 06.11.2010    source источник


Ответы (3)


Я не уверен, есть ли что-то встроенное, но вы можете написать свое собственное. Что-то типа:

var authHeader = Request.ServerVariables["HTTP_AUTHORIZATION"];
if (authHeader.StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase))
{
    var authParams = Encoding.Default.GetString(Convert.FromBase64String(authHeader.Substring("Basic ".Length)));
    var arr = authParams.Split(':');
    var username = arr[0];
    var password = arr[1];
}   

Если вы пишете свою собственную REST-инфраструктуру в MVC, у вас может быть базовый класс Controller и метод, подобный этому, который запускается перед каждым действием для аутентификации вызывающего объекта.

person realworldcoder    schedule 13.11.2010
comment
Привет, реальный кодер. Да, мое текущее решение выглядит примерно так. Я реализовал пользовательский атрибут AuthrorizeAttribute, который проверяет переменные запроса. Срочно выложу решение =) - person schwindelig; 15.11.2010
comment
Хороший. Вы могли бы иметь проверки в методе OnActionExecuting() вашего базового контроллера, если вы еще этого не сделали. - person realworldcoder; 16.11.2010

Вы можете легко использовать структуру членства ASP.NET со службами ASP.NET MVC RESTful. См. следующую ссылку для его реализации с помощью служб MVC RESTful.

http://msdn.microsoft.com/en-us/magazine/dd943053.aspx

Если вы не знаете о структуре членства, используйте следующую ссылку

http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx

надеюсь поможет, спасибо

person Naveen    schedule 06.11.2010
comment
Привет, Навин, спасибо. Таким образом, в основном клиент должен просмотреть весь DOM и отправить свои учетные данные в существующую форму входа, верно? Это не кажется мне очень RESTful. Есть ли способ использовать учетные данные, которые можно передать в заголовке запроса? - person schwindelig; 07.11.2010

Дэйв,

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

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

В случае, если это большая часть накладных расходов, и вы ищете что-то вроде функциональности веб-сервисов, я советую вам изучить WCF Services/Ado.NET Data Services. Они более легко интегрируются со структурой членства и могут лучше подходить для ваших результатов.

Я надеюсь, что это поможет, спасибо.

person Naveen    schedule 07.11.2010
comment
Хотя все это работает, строго говоря, cookie, вероятно, нарушает принципы RESTful, сохраняя состояние сеанса между вызовами. - person realworldcoder; 16.11.2010