Как я могу получить токен на предъявителя, который я могу передать в 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;
}
}
Для создания этой виртуальной машины у вас должны быть соответствующие права. Вы должны быть добавлены по крайней мере в качестве участника для этой группы ресурсов.
Вы можете получить свой идентификатор арендатора на портале Azure. Вы найдете это следующим образом: Azure Active Directory -> Свойства -> Идентификатор каталога. Но в большинстве случаев вы можете просто использовать свое имя арендатора, это часть после "@" в идентификаторе вашей учетной записи. (***.onmicrosoft.com или ваш пользовательский домен)
Создайте приложение.NEt Framework и установите пакет Microsoft.IdentityModel.Clients.ActiveDirectory из nuget.
Код:
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 обходных пути:
Получить токен в интерактивном режиме.
Используйте учетные данные клиента, чтобы получить токен для своего приложения и управлять ресурсами.
Приобретите токен для пользователя на один раз, и вы получите токен обновления. Вы можете использовать его для получения нового токена. Обновление токенов доступа
Используйте путь Джой. Вы можете использовать управляемую идентификацию.