Как я могу аутентифицироваться в Active Directory, чтобы получить доступ к защищенной функции Azure из консольного приложения? - PullRequest
0 голосов
/ 28 апреля 2020

Мне удалось успешно выполнить sh следующее:

  1. Включена аутентификация / авторизация для моей Azure функции.
  2. Создана регистрация приложения в Azure для моя функция должна вызываться безопасно через AAD auth.
  3. Я могу успешно пройти аутентификацию, получить токен и нажать на мою Azure функцию от Почтальона.

Мой вопрос заключается в том, как я могу программно сделать то же самое, скажем, из консольного приложения, которое я создал? Получу ли я приглашение ввести свои учетные данные Microsoft или можно как-то настроить учетные данные для передачи в консольное приложение для проверки подлинности?

1 Ответ

0 голосов
/ 28 апреля 2020

Здесь я приведу образец для вашей справки. Сначала код получает токен доступа, а затем использует токен доступа для запроса URL-адреса вашей функции в консольном приложении. Когда я получаю токен доступа, в коде я предоставляю два пути (предоставление пароля и предоставление клиента_кредента), вы можете выбрать любой из них.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

namespace ConsoleApp16
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            //Get a access token(password grant)
            HttpClient client = new HttpClient();
            var values = new Dictionary<string, string>
            {
                { "client_id", "<your app client id>" },
                { "scope", "<scope>" },
                { "username", "<username>" },
                { "password", "<password>" },
                { "grant_type", "password" },
                { "client_secret", "<your app client secret>" }
            };

            var content = new FormUrlEncodedContent(values);
            var response = await client.PostAsync("https://login.microsoftonline.com/<your tenant id>/oauth2/v2.0/token", content);
            String responseString = await response.Content.ReadAsStringAsync();
            dynamic json = JsonConvert.DeserializeObject<Response>(responseString);
            String accessToken = json.access_token;

            //You can also get the access token by the code below(client_credential grant)
            /*
            HttpClient client = new HttpClient();
            var values = new Dictionary<string, string>
            {
                { "client_id", "<your app client id>" },
                { "scope", "<scope>" },
                { "client_secret", "<your app client secret>" },
                { "grant_type", "client_credentials" },
            };

            var content = new FormUrlEncodedContent(values);
            var response = await client.PostAsync("https://login.microsoftonline.com/<your tenant id>/oauth2/v2.0/token", content);
            var responseString = await response.Content.ReadAsStringAsync();
            dynamic json = JsonConvert.DeserializeObject<Response>(responseString);
            String accessToken = json.access_token;
            */

            //Use the access token to request your function url
            HttpClient client1 = new HttpClient();
            client1.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
            var response1 = await client1.GetAsync("https://myfunapp.azurewebsites.net/api/myHTTPtrigger?name=azure");
            String responseString1 = await response1.Content.ReadAsStringAsync();
            Console.WriteLine(responseString1);
        }
    }

    public class Response
    {
        public string access_token { get; set; }

    }
}

Для получения источника некоторых параметров, указанных выше, пожалуйста, go Ваше приложение, которое сначала зарегистрировалось в AD.

Вы можете найти client_id и tenantId на скриншоте ниже: enter image description here

Вам нужно новое секрет клиента на скриншоте ниже, это параметр client_secret в коде выше. enter image description here

Параметр scope в моем коде происходит отсюда: enter image description here

...