Azure Функции OAuth2 от электронной почты / пароля хранятся в базе данных? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть база данных, которая содержит электронную почту и хэши паролей.

Я хотел бы защитить триггеры http от Azure Функции, позволяющие разрешать только авторизованный вызов благодаря заголовку авторизации с токеном BEARER.

Я думаю, мне понадобится

  1. триггер http, который сгенерирует токен из электронной почты / пароля
  2. Авторизация и аутентификация пользователя на основе заголовка авторизации

Может кто-нибудь подсказать мне, как создать собственный провайдер аутентификации или использовать существующего и настроить Azure Функции для работы с ним?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вы можете посмотреть следующий фрагмент кода, который я тестировал на портале azure, Azure Function V2:

#r "Newtonsoft.Json"
using Newtonsoft.Json;
using System.Net;
using System.Net.Http.Headers;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{


    try
    {
       //Parse query parameter

              log.LogInformation("C# HTTP trigger function processed a request.");

                //Read Request Body
                var content = await new StreamReader(req.Body).ReadToEndAsync();

                //Extract Request Body and Parse To Class
                UserAuthentication objUserInfo = JsonConvert.DeserializeObject<UserAuthentication>(content);

               //Message Container
                dynamic validationMessage;

              //Validate required param

            if (string.IsNullOrEmpty(objUserInfo.UserName.Trim()))
                {
                    validationMessage = new OkObjectResult("User name is required!");
                    return (IActionResult)validationMessage;

                }
            if (string.IsNullOrEmpty(objUserInfo.Password.Trim()))
                {
                    validationMessage = new OkObjectResult("Password is required!");
                    return (IActionResult)validationMessage;
                }



                // Authentication Token Request format
                string tokenUrl = $"https://login.microsoftonline.com/common/oauth2/token";
                var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

                tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
                {
                    ["grant_type"] = "password",
                    ["client_id"] = "YourApplicationId",
                    ["client_secret"] = "YourApplicationPassword",
                    ["resource"] = "https://graph.microsoft.com",
                    ["username"] = "" + objUserInfo.UserName + "",
                    ["password"] = "" + objUserInfo.Password + ""


                });

                // Request For Token Endpoint 

                using (var _client = new HttpClient())
                {
                    var tokenResponse = await _client.SendAsync(tokenRequest);
                    AccessTokenClass objAccessToken = JsonConvert.DeserializeObject<AccessTokenClass>(await tokenResponse.Content.ReadAsStringAsync());

                    // When Token Request Null
                    if (objAccessToken.access_token == null)
                    {
                        validationMessage = new OkObjectResult("Invalid Authentication! Please Check Your Credentials And Try Again!");
                        return (IActionResult)validationMessage;

                    }
                    else
                    {
                          return new OkObjectResult(objAccessToken.access_token);
                    }



                }



    }
    catch (Exception ex)
    {
            validationMessage = new OkObjectResult("Sorry something went wrong! Please check your given information and try again! {0}" + ex.Message);
            return (IActionResult)validationMessage;

    }
}

Класс, который я использовал: UserAuthentication Class

public class UserAuthentication
    {

        public string UserName { get; set; }
        public string Password { get; set; }

    }
public class AzureFunctionCreateUserClass
    {

           public string access_token { get; set; }
           public string expires_in { get; set; }
           public string token_type { get; set; }
           public string resource { get; set; }

    }

Примечание: Это пример портала azure, который я написал для функции azure. Поэтому попытайтесь бежать туда.

Надеюсь, это поможет.

0 голосов
/ 10 февраля 2020

Идентификационная платформа Microsoft поддерживает грант OAuth 2.0 для владельца пароля (ROP C) , который позволяет приложению входить в систему пользователя, напрямую обрабатывая его пароль.

Получить адрес электронной почты (имя пользователя) и пароль из базы данных, и отправьте следующий запрос на получение токена доступа.

POST {tenant}/oauth2/v2.0/token
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&scope=user.read%20openid%20profile%20offline_access
&username=MyUsername@myTenant.com
&password=SuperS3cret
&grant_type=password
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...