it-swarm.com.ru

Использование веб-токенов JSON (JWT) с функциями Azure (БЕЗ использования Active Directory)

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

https://docs.Microsoft.com/en-us/dotnet/framework/security/json-web-token-handler-api-reference

Итак, вот что я (и я уверен, многие другие) хотели бы достичь:

Definition: ID пользователя = имя пользователя или адрес электронной почты, используемые для входа в систему.

АУТЕНТИФИКАЦИЯ:

  1. Пользователь входит в систему. Пользователь заполняет веб-форму, и система отправляет (через HTTPS POST) идентификатор пользователя и пароль (хэшированные) на сервер для аутентификации/проверки пользователя.

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

  3. Создать токен JWT - ???? Нет доступной документации!

  4. Вернуть токен JWT вызывающей стороне - ???? - Я предполагаю в шапке? через JSON, не уверен - опять же - без документации.

Учитывая приведенный ниже код, может ли кто-нибудь предоставить пример кода для шагов 3 и 4?

  [FunctionName( "authenticate" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get user ID and password from POST data

   /*
   * Step 2 - Verify user ID and password (compare against DB values)
   * If user ID or password is not valid, return Invalid User response
   */

   // Step 3 - Create JWT token - ????

   // Step 4 - Return JWT token - ????

  }

АВТОРИЗАЦИЯ:

Предполагая, что пользователь прошел аутентификацию и теперь имеет токен JWT (я предполагаю, что токен JWT сохранен в сеансе пользователя; если кто-то хочет предоставить больше информации, сделайте это):

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

  2. Токен JWT проверен - ???? Нет доступной документации!

  3. Если токен JWT НЕ действителен, функция возвращает ответ BadRequest.

  4. Если токен JWT действителен, функция использует переданные ей данные для обработки и выдачи ответа.

Учитывая приведенный ниже код, может ли кто-нибудь предоставить пример кода для шагов 1 и 2?

  [FunctionName( "do_something" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get JWT token (from POST data or headers?)

   // Step 2 - Validate the JWT token - ???

   // Step 3 - If JWT token is not valid, return BadRequest response

   // Step 4 - Process the request and return data as JSON

  }

Любая и вся информация действительно помогла бы тем из нас (меня), которые понимают, как использовать JWT с функциями Azure (анонимными) для создания «безопасного» REST API.

Заранее спасибо.

5
bdcoder

Любая и вся информация действительно помогла бы тем из нас (меня), которые понимают, как использовать JWT с функциями Azure (анонимными) для создания «безопасного» REST API.

Насколько я понимаю, вы можете использовать соответствующую библиотеку в коде функции Azure для генерации/проверки токена JWT. Вот некоторые уроки, вы можете обратиться к ним:

Создание и использование токенов JWT в C #

Jwt.Net, реализация JWT (JSON Web Token) для .NET

Аутентификация JWT для Asp.Net Web Api

Более того, вы можете использовать Аутентификация/авторизация службы приложений для настройки функции приложения на уровне Аутентификация/Авторизация. Вы можете перейти к настройкам приложения-функции, нажать «СЕТЬ»> «Аутентификация/авторизация» на вкладке «Функции платформы». Включите аутентификацию службы приложений и выберите Разрешить анонимные запросы (без действий) следующим образом:

 enter image description here

Вы можете создать функцию HttpTrigger с анонимным доступом для регистрации пользователей и вернуть токен JWT, если пользователь существует. Для защищенных API REST вы можете следовать приведенному ниже примеру кода:

if(System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated)
{
   //TODO: retrieve the username claim
   return req.CreateResponse(HttpStatusCode.OK,(System.Security.Claims.ClaimsPrincipal.Current.Identity as ClaimsIdentity).Claims.Select(c => new { key = c.Type, value = c.Value }),"application/json");
}
else
{
    return req.CreateResponse(HttpStatusCode.Unauthorized,"Access Denied!"); 
}

Чтобы сгенерировать токен JWT, используемый в Аутентификации службы приложений, вы могли бы выполнить Как: использовать пользовательскую аутентификацию для своего приложения и код в пользовательском контроллере API CustomAuthController из книги Адриана Холла о Пользовательская аутентификация , чтобы создать JWT маркер.

Обновление:

Для пользовательского подхода к аутентификации в разделе «Аутентификация службы приложений» я просто хочу использовать опцию аутентификации/авторизации, предоставляемую EasyAuth. Я провел некоторые испытания для этого подхода и обнаружил, что он может работать на моей стороне. Op может отправить имя пользователя и пароль в HttpTrigger для аутентификации, тогда бэкэнд HttpTrigger должен проверить информацию о пользователе и использовать Microsoft.Azure.Mobile.Server.Login package для выдачи токена аутентификации службы приложений затем клиент может получить токен из свойства AuthenticationToken. Последующие запросы к защищенным API могут выглядеть следующим образом:

https://<your-funapp-name>.azurewebsites.net/api/<httpTrigger-functionName>
Header: x-zumo-auth:<AuthenticationToken>

НОТА:

Для этого подхода соответствующие функции HttpTrigger должны разрешать анонимный доступ, а аутентификация службы приложений также должна выбирать Разрешить анонимные запросы (никаких действий). В противном случае проверка подлинности службы приложений и проверка подлинности на уровне функций будут проверять запрос. Для защищенных API оператору необходимо вручную добавить проверку System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated.

8
Bruce Chen

Попробуйте это: https://liftcodeplay.com/2017/11/25/validating-auth0-jwt-tokens-in-Azure-functions-aka-how-to-use-auth0-with-Azure-functions/ Я успешно заставил его работать, используя это руководство. Это заняло некоторое время из-за версий nuget.

Следуйте этому руководству и используйте следующие версии nuget

IdentityModel.Protocols (2.1.4)
IdentityModel.Protocols.OpenIdConenct (2.1.4)
IdentityModel.Tokens.Jwt (5.1.4)

Да, и руководство говорит вам написать свою АУДИТОРИЮ в качестве ссылки API, не надо. Вы получите несанкционированную ошибку. Просто напишите название вашего API, например, MyAPI 

Если вы получаете сообщение о том, что System.http.formatting не загружается при запуске функции, попробуйте переустановить NET.Sdk.Functions и проигнорируйте предупреждение о восстановлении AspNet.WebApi.Client с помощью .NETFramework. И перезапустите визуальную студию.

3
Charles Dickens

То, что вы описываете, - это то, что вы должны уметь сделать самостоятельно, сделав небольшое исследование. Чтобы ответить на ваши конкретные вопросы:

Создать токен JWT - ???? Нет доступной документации!

Ссылка, которую дал вам Брюс, дает хороший пример того, как создать JWT: https://www.codeproject.com/Tips/1208535/Create-And-Consume-JWT-Tokens-in-csharp

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

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

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

То, как вы отправляете токен, опять же полностью зависит от вас. Большинство платформ используют заголовок запроса HTTP Authorization, но вам это не нужно, если вы этого не хотите.

Токен JWT проверен - ???? Нет доступной документации!

Используйте ValidateToken метод JwtSecurityTokenHandler (см. Предыдущую ссылку для получения JwtSecurityTokenHandler). Документы здесь: https://msdn.Microsoft.com/en-us/library/dn451155(v=vs.114).aspx .

0
Chris Gillum