Аутентификация пользователя в веб-интерфейсе ASP.NET

Эта тема была невероятно запутанной для меня. Я новичок в приложениях HTTP, но вам нужно разработать клиент iPhone, который где-то использует данные JSON. Я выбрал веб-API от MS, потому что это казалось достаточно простым, но когда дело доходит до аутентификации пользователей, все становится довольно неприятным.

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

Это не вопрос, а запрос на пример того, как это сделать. Я просмотрел следующие страницы:

  • Обеспечение безопасности веб-API ASP.NET
  • Базовая аутентификация с помощью веб-API ASP.NET

Несмотря на то, что они объясняют, как обрабатывать несанкционированные запросы, они не демонстрируют явно что-то вроде LoginController или что-то в этом роде, чтобы запрашивать учетные данные пользователя и проверять их.

Любой, кто хочет написать хороший простой пример или указать мне в правильном направлении, пожалуйста?

Благодарю.

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

Это потому, что вы путаетесь с этими двумя понятиями:

  • Аутентификация – это механизм, посредством которого системы могут безопасно идентифицировать своих пользователей. Системы аутентификации предоставляют ответы на вопросы:

    • Кто является пользователем?
    • Действительно ли пользователь, кем он / она себя представляет?
  • Авторизация – это механизм, с помощью которого система определяет, какой уровень доступа должен иметь определенный аутентифицированный пользователь для обеспечения ресурсов, контролируемых системой. Например, система управления базами данных может быть спроектирована таким образом, чтобы предоставить определенным определенным лицам возможность извлекать информацию из базы данных, но не возможность изменять данные, хранящиеся в базе данных, в то же время предоставляя другим людям возможность изменять данные. Системы авторизации предоставляют ответы на вопросы:

    • Доступен ли пользователь X для доступа к ресурсу R?
    • Является ли пользователь X уполномоченным выполнять операцию P?
    • Является ли пользователь X уполномоченным выполнять операцию P на ресурсе R?

Атрибут Authorize в MVC используется для применения правил доступа, например:

  [System.Web.Http.Authorize(Roles = "Admin, Super User")] public ActionResult AdministratorsOnly() { return View(); } 

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

Эти правила также можно установить в файле web.config, используя элемент location . Пример:

          

Однако, прежде чем эти правила авторизации будут выполнены, вы должны пройти аутентификацию на текущем веб-сайте .

Несмотря на то, что они объясняют, как обрабатывать несанкционированные запросы, они не демонстрируют явно что-то вроде LoginController или что-то в этом роде, чтобы запрашивать учетные данные пользователя и проверять их.

Отсюда мы могли бы разделить проблему на две части:

  • Аутентификация пользователей при использовании служб веб-API в одном и том же веб-приложении

    Это будет самый простой подход, потому что вы будете полагаться на аутентификацию в ASP.Net

    Это простой пример:

    Web.config

        

    Пользователи будут перенаправлены на маршрут учетной записи / входа , там вы сможете настроить пользовательские элементы управления для запроса учетных данных пользователя, а затем вы установите cookie аутентификации, используя:

      if (ModelState.IsValid) { if (Membership.ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); return RedirectToAction("Index", "Home"); } else { ModelState.AddModelError("", "The user name or password provided is incorrect."); } } // If we got this far, something failed, redisplay form return View(model); 
  • Кросс-платформенная аутентификация

    Этот случай будет заключаться в том, что вы только показываете услуги веб-API в веб-приложении, поэтому у вас будет другой клиент, который будет использовать эти услуги, клиентом может быть другое веб-приложение или любое приложение .Net (Win Forms, WPF, консоль, служба Windows, и т.д)

    Например, предположим, что вы будете использовать службу веб-API из другого веб-приложения в том же сетевом домене (внутри интрасети), в этом случае вы можете положиться на аутентификацию Windows, предоставляемую ASP.Net.

      

    Если ваши услуги отображаются в Интернете, вам необходимо передать аутентифицированные токены каждой службе веб-API.

    Для получения дополнительной информации возьмите добычу в следующие статьи:

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

 void EnsureAuthenticated(string role) { string[] parts = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(Request.Headers.Authorization.Parameter)).Split(':'); if (parts.Length != 2 || !Membership.ValidateUser(parts[0], parts[1])) throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No account with that username and password")); if (role != null && !Roles.IsUserInRole(parts[0], role)) throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "An administrator account is required")); } 

С клиентской стороны этот помощник создает HttpClient с заголовком проверки подлинности:

 static HttpClient CreateBasicAuthenticationHttpClient(string userName, string password) { var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userName + ':' + password))); return client; } 

Я работаю над проектом MVC5 / Web API и должен иметь возможность получить авторизацию для методов Web Api. Когда мой индексный указатель сначала загружен, я делаю вызов метода «токена» Web API, который, как я считаю, создается автоматически.

Код стороны клиента (CoffeeScript) для получения токена:

 getAuthenticationToken = (username, password) -> dataToSend = "username=" + username + "&password=" + password dataToSend += "&grant_type=password" $.post("/token", dataToSend).success saveAccessToken 

В случае успеха вызывается следующее, которое локально сохраняет токен аутентификации:

 saveAccessToken = (response) -> window.authenticationToken = response.access_token 

Тогда, если мне нужно сделать вызов Ajax методу Web API, который имеет тег [Authorize], я просто добавляю следующий заголовок к моему вызову Ajax:

 { "Authorization": "Bearer " + window.authenticationToken } 
  • JSON.NET как сериализатор OAP для WebAPI 2 и ODataMediaTypeFormatter
  • Как добавить глобальные фильтры ASPI Web Api?
  • Поместить контент в объект HttpResponseMessage?
  • ASP.NET Web API, неожиданный конец многочастного streamа MIME при загрузке из Flex FileReference
  • ASP.net MVC4 WebApi маршрут с именем файла в нем
  • Рабочий многоточечный запрос POST с волейболом и без HttpEntity
  • IIS захватывает запрос CORS Preflight OPTIONS
  • Должен ли ServiceStack быть служебным слоем в приложении MVC или должен ли он вызвать сервисный уровень?
  • Отключить проверку подлинности Windows для WebAPI
  • Разница между проектом MVC 5 и проектом Web Api
  • ASP.NET Core MVC: как получить необработанный JSON привязан к строке без типа?
  • Interesting Posts

    Sublime Text 2 – просмотр пробельных символов

    Почему пример по умолчанию не изменяет входной параметр?

    Является ли инициализация статической членской переменной C ++ streamобезопасной?

    Проблема при сохранении данных от Spark-Streaming до Cassandra

    Как читать частоту процессора на устройстве Android

    Преобразование римских чисел в десятичные числа

    Используйте Блюдо Сеть с ТВ-тюнером: как?

    Ошибка производительности XmlSerializer при указании XmlRootAttribute

    Ошибка: не удается получить доступ к файловому ящику / Debug / …, потому что он используется другим процессом

    Сохранение параметров строки запроса запроса GET в форме JSF

    Почему std :: map operator создает объект, если ключ не существует?

    Можно ли положить плитки на рабочий стол Windows 8?

    Формат даты и времени в asp.net mvc 4

    Система не загружается с разных загрузочных дисков восстановления

    Как сделать диск Blu-ray / DVD / HD-DVD несколькими регионами?

    Давайте будем гением компьютера.