Как я могу получить токен на предъявителя, который я могу передать в Azure Rest API?

Я хочу использовать azure-vm-rest-api для создания виртуальной машины из C#. Моя проблема в том, что у меня нет clientID и tenantID. У меня просто есть имя пользователя и пароль от Microsoft. Я пытаюсь этот API отдыха от POSTMAN, и я успешно делаю это. Значит, я взял токен на предъявителя из раздела "Развертывание". Я хочу сгенерировать это из кода.

используя этот портал, чтобы получить токен на предъявителя.

https://docs.microsoft.com/en-us/rest/api/resources/deployments/createorupdate (попробуйте раздел), как только я войду в систему, вернет мне токен на предъявителя. Этот токен на предъявителя я использую в звонках почтальона.

Теперь я хочу, как я могу сгенерировать токен-носитель из C#, чтобы я передавал его в REST API при вызове из C#. У меня нет идентификатора клиента и арендатора.

3 ответа

Решение

Вы могли бы использовать Microsoft.Azure.Services.AppAuthentication библиотека, чтобы сделать это.

static void Main(string[] args)
        {
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            string accessToken = azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/").Result;
            Console.WriteLine(accessToken);
        }

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

public static string accessToken = string.Empty;     
 static void Main(string[] args)
            {
                try
                {
                    GetTokenWithoutSecretCode();
                    string url = "https://management.azure.com/subscriptions/SubscriptionID/resourcegroups/ResourceGroupName/providers/Microsoft.Resources/deployments/detdepoyment?api-version=2019-05-01";
                    string jsonContent = "{ \"properties\": {   \"templateLink\": {     \"uri\": \"https://storageName.blob.core.windows.net/templates/VMTemplate.json\",     \"contentVersion\": \"1.0.0.0\"   },   \"parametersLink\": {     \"uri\": \"https://storageName.blob.core.windows.net/templates/VMParam.json\",     \"contentVersion\": \"1.0.0.0\"   },   \"mode\": \"Incremental\" }}";
                    SpinupVM(url, jsonContent, accessToken);
                }
                catch (Exception ex)
                {
                    string message = ex.Message;
                    Console.WriteLine(ex.Message);
                    Console.ReadLine();
                }
            }

            private static void GetTokenWithoutSecretCode()
            {
                try
                {

                    AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
                    accessToken = azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/").Result;
                }
                catch
                {
                    throw;
                }
            }

            // POST a JSON string
            private static void SpinupVM(string url, string jsonContent, string authToken)
            {
                JObject json = JObject.Parse(jsonContent);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "PUT";
                request.Headers.Add("Authorization", "Bearer " + authToken);
                System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                Byte[] byteArray = encoding.GetBytes(json.ToString());
                request.ContentLength = byteArray.Length;
                request.ContentType = "application/json";
                using (Stream dataStream = request.GetRequestStream())
                {
                    dataStream.Write(byteArray, 0, byteArray.Length);
                }
                long length = 0;
                try
                {
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        length = response.ContentLength;
                    }
                }
                catch
                {
                    throw;
                }
            }

Для создания этой виртуальной машины у вас должны быть соответствующие права. Вы должны быть добавлены по крайней мере в качестве участника для этой группы ресурсов.

  1. Вы можете получить свой идентификатор арендатора на портале Azure. Вы найдете это следующим образом: Azure Active Directory -> Свойства -> Идентификатор каталога. Но в большинстве случаев вы можете просто использовать свое имя арендатора, это часть после "@" в идентификаторе вашей учетной записи. (***.onmicrosoft.com или ваш пользовательский домен)

  2. Создайте приложение.NEt Framework и установите пакет Microsoft.IdentityModel.Clients.ActiveDirectory из nuget.

  3. Код:

    class Program
    {
        static void Main(string[] args)
        {
            string tenantId = "your tenant id or tenant name";
            string clientId = "1950a258-227b-4e31-a9cf-717495945fc2";
            string resource = "https://management.core.windows.net/";
            string username = "your work account, jack@hanxia.onmicrosoft.com";
            string password = "your password";

            var upc = new UserPasswordCredential(username, password);
            var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId);
            AuthenticationResult result = context.AcquireTokenAsync(resource,clientId,upc).Result;
            Console.WriteLine(result.AccessToken);
            Console.ReadLine();
        }
    }

Затем вы можете использовать токен доступа для вызова API Azure REST.

Обновления:

Вы получили ошибку, потому что ваш администратор включил MFA. Таким образом, вы не сможете использовать поток предоставления пароля для получения токена напрямую. Было бы 4 обходных пути:

  1. Получить токен в интерактивном режиме.

  2. Используйте учетные данные клиента, чтобы получить токен для своего приложения и управлять ресурсами.

  3. Приобретите токен для пользователя на один раз, и вы получите токен обновления. Вы можете использовать его для получения нового токена. Обновление токенов доступа

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

Другие вопросы по тегам