Подтвердить что ты не робот

Аутентификация веб-API ASP.NET

Я создал новый веб-API ASP.NET, и все работает хорошо. Я сейчас нахожусь там, где я хочу защитить API.

Я положил атрибут [Authorize] над моим базовым контроллером, и он работает правильно, если я хочу совершать вызовы API внутри самого приложения ASP.NET.

Однако мне интересно, что лучше всего подходит для внешнего клиента, который хочет совершать вызовы API и пройти авторизацию? Кроме того, имея в виду, у меня есть пользовательская логика аутентификации.

Как клиент должен отправлять учетные данные? В какой момент я обрабатываю эти учетные данные?

4b9b3361

Ответ 1

Как мне отправить учетные данные клиента?

Расположение по умолчанию для отправки информации аутентификации - это заголовок авторизации. Вы можете использовать это для базовой аутентификации, а также для других типов аутентификации (JWT, Bearer и т.д.).

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Чтобы добавить, например, базовый заголовок проверки подлинности к вашему запросу, вы можете использовать следующий код на своем клиенте:

WebRequest request = (HttpWebRequest)WebRequest.Create("https://yoururl");
request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("user:password")));

В какой момент я обрабатываю эти учетные данные?

Я бы написал DelegatingHandler и использовал его, чтобы разрешить ваш "главный". Затем вы можете установить его в HttpContext.CurrentPrincipal, чтобы он был доступен там, где вам это нужно, в рамках запроса. DelegatingHandler вызывается перед вашими контроллерами, как вы можете видеть на изображении ниже, что делает его идеальным для логики аутентификации.

enter image description here

Я бы сделал то же самое на клиенте (напишите DelegatingHandler или ActionFilterAttribute), чтобы добавить заголовок проверки подлинности по умолчанию. Обратите внимание, что DelegatingHandler являются частью конвейера HTTP и ActionFilterAttribute относятся к конвейеру MVC.

И последнее, но не менее важное: я бы рекомендовал не писать собственную логику проверки подлинности, но придерживаться одной из стандартных фреймворков. Это может быть так же просто, как использование базовой аутентификации по протоколу HTTPS и столь же сложно, как реализация OAuth. Но я бы держался подальше от своих решений.

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

Примечание. ASP.NET Web Api основан на REST, поэтому imho вы не хотите вообще хранить информацию о сеансе.

Изменить:. Пример того, как реализовать обработчик делегирования, который обрабатывает базовую аутентификацию, см.: базовая HTTP-аутентификация в asp.net web api с помощью обработчиков сообщений.

Ответ 2

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

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