1
votes

Comment puis-je obtenir le jeton porteur que je peux transmettre à l'API Azure Rest

Je souhaite utiliser azure-vm-rest-api pour créer la VM à partir de c #. Mon problème est que je n'ai pas clientID et tenantID. J'ai juste mon nom d'utilisateur et mon mot de passe Microsoft. J'essaye cette API de repos de POSTMAN et je le fais avec succès. Cela signifie que j'ai pris le jeton de porteur de la section Essayez-le de déployer. Je veux le générer à partir du code.

utiliser ce portail pour obtenir le jeton porteur.

https://docs.microsoft.com/en -us / rest / api / resources / deployments / createorupdate (section essayez-le) une fois que je me suis connecté, il me rendra le jeton porteur. Ce jeton porteur que j'utilise dans les appels du facteur.

Maintenant, je veux comment puis-je générer le jeton de support à partir du C # afin de le transmettre à l'API REST lors de son appel à partir de C #. Je n'ai pas d'identifiant de client et de locataire.


11 commentaires

Votre compte est-il un compte professionnel ou un compte personnel? Et cela vous dérange-t-il de créer une application dans votre Azure AD pour obtenir un jeton d'accès?


Compte professionnel.Et cela vous dérange-t-il de créer une application dans votre Azure AD pour obtenir un jeton d'accès? Il n'y a pas de solution de contournement pour que je reçoive le jeton de porteur en passant le nom d'utilisateur et le mot de passe.


Il existe une application prédéfinie de Microsoft que vous utiliserez pour vous connecter au portail Azure. Je vous écrirai un échantillon plus tard.


Merci @jack jia. J'ai hâte de voir cette application.


Une mise à jour de ce problème?


J'ai créé une application dans AD mais j'obtiens des erreurs; -En raison d'un changement de configuration effectué par votre administrateur, ou parce que vous avez déménagé vers un nouvel emplacement, vous devez vous inscrire à l'authentification multifacteur pour accéder. Maintenant, j'ai également clientID.tenantid avec moi. Et j'utilise le code ci-dessous.


Avez-vous essayé ma solution? pas besoin de créer quoi que ce soit, la bibliothèque Microsoft.Azure.Services.AppAuthentication utilise vos informations d'identification de développeur pour s'exécuter dans votre environnement de développement local. Lorsque la solution est déployée sur Azure, la bibliothèque utilise une identité managée pour basculer vers un flux d'octroi d'informations d'identification client OAuth 2.0. Cela signifie que vous pouvez tester le même code localement et à distance sans souci.


Merci @JoyWang pour cela. Cela fonctionne bien dans le développement local. J'exécute ce code dans exe et je vais exécuter cet exe dans le pipeline CD. Lorsque j'exécute cette application sur CD, j'ai reçu le statut 403.Je le sais parce qu'il fonctionne en mode agent et que l'agent a un compte différent.


Je ne suis pas familier avec les devops azur, je vous recommande de poser la question spécifique dans un autre post.


Il semble que vous deviez ajouter le principal de service lié aux devops en tant que rôle à votre abonnement.


Merci JoyWang maintenant mon problème résolu avec votre code. Nous avons ajouté notre agent en tant que contributeur à l'abonnement Azure.


3 Réponses :


0
votes
  1. Vous pouvez obtenir votre ID de locataire à partir du portail Azure. Vous le trouvez de cette manière: Azure Active Directory -> Propriétés -> ID de répertoire. Mais, dans la plupart des cas, vous pouvez simplement utiliser votre nom de locataire, c'est la partie après le "@" dans votre identifiant de compte. (***. onmicrosoft.com ou votre domaine personnalisé)

  2. Créez une application de structure .NEt et installez le package Microsoft.IdentityModel.Clients.ActiveDirectory à partir de nuget.

  3. Le code:

  4.     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();
            }
        }
    

     enter image description here

    Ensuite, vous pouvez utiliser le jeton d'accès pour appeler l'API Azure REST.

    Vous avez obtenu l'erreur, car votre administrateur a activé l'authentification multifacteur. Vous ne pourrez donc pas utiliser le flux d'octroi de mot de passe pour acquérir directement un jeton. Il y aurait 4 solutions de contournement:

    1. Acquérir le jeton de manière interactive.

    2. Utilisez les informations d'identification du client pour acquérir un jeton pour votre application et gérer les ressources.

    3. Acquérez un jeton pour l'utilisateur pour une fois, et vous obtiendrez un jeton d'actualisation. Vous pouvez l'utiliser pour obtenir un nouveau jeton. Actualisation des jetons d'accès

    4. Utilisez la manière de Joy. Vous pouvez utiliser une identité gérée.


4 commentaires

D'où je peux obtenir l'identifiant du client.


@AbhinavSharma Utilisez simplement le 1950a258-227b-4e31-a9cf-717495945fc2. Il s'agit d'un client prédéfini de Microsoft pour le public.


Ce code ne fonctionne pas J'obtiens une erreur: -En raison d'un changement de configuration effectué par votre administrateur, ou parce que vous avez déménagé vers un nouvel emplacement, vous devez vous inscrire à l'authentification multifacteur pour accéder.J'ai passé mon clientID.


Deuxièmement, je ne peux pas transmettre mes informations d'identification. À des fins de test, c'est correct, mais pour la production, qui fournira ses propres informations d'identification?



1
votes

Vous pouvez utiliser la bibliothèque Microsoft.Azure.Services.AppAuthentication pour ce faire.

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

 entrez la description de l'image ici p>

Pour plus de détails sur l'authentification, vous pouvez vous référer à ce lien . Voici un exemple similaire pour utiliser le jeton pour appeler le reste de l'API, vous pouvez également y jeter un œil.


0 commentaires

1
votes
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;
                }
            }
For Creating this VM, You must have proper rights for this. You must be added at least as a contributor for that resource group.

2 commentaires

désolé @JoyWang, je m'excuse. Maintenant, j'ai accepté votre réponse. J'ai fait cette erreur parce que je veux que si quelqu'un veut faire la même chose en c #, alors c'est un exemple complet (le mien).


eh bien, je vote votre réponse, je pense que d'autres la trouveront.