【问题标题】:How I can I get the bearer token that i can pass to azure rest api我如何获得可以传递给 azure rest api 的不记名令牌
【发布时间】:2019-07-16 14:20:40
【问题描述】:

我想使用 azure-vm-rest-api 从 c# 创建 VM。我的问题是我没有clientID 和tenantID。我只有我的 Microsoft 用户名和密码。我正在尝试来自 POSTMAN 的这个 REST API,并且我成功地做到了。意味着我从 Deploy try it 部分获取了不记名令牌。我想从代码中生成它。

使用此门户获取不记名令牌。

https://docs.microsoft.com/en-us/rest/api/resources/deployments/createorupdate(试试吧) 一旦我登录,它将返回我的不记名令牌。我在邮递员电话中使用的不记名令牌。

现在我想如何从 C# 生成不记名令牌,以便在从 C# 调用它时将其传递给 REST API。我没有任何客户和租户 ID。

【问题讨论】:

  • 您的账户是工作账户还是个人账户?你介意在你的 Azure AD 中创建一个应用程序来获取访问令牌吗?
  • 工作帐户。您介意在 Azure AD 中创建应用程序以获取访问令牌吗?--在 AD 中创建应用程序是否有必要?没有解决方法可以传递用户名和密码我将获得不记名令牌。
  • 有一个来自 Microsoft 的预定义应用程序,您将使用它来登录到 Azure 门户。稍后我会写一个示例给你。
  • 谢谢@jack jia。我期待看到这个应用程序。
  • 感谢 JoyWang 现在我的问题已经用你的代码解决了。我们已将我们的代理添加为 Azure 订阅中的贡献者。

标签: azure azure-active-directory azure-rest-api


【解决方案1】:

您可以使用 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);
        }

有关身份验证的更多详细信息,您可以参考linkHere是一个类似使用token调用rest api的样例,你也可以看看。

【讨论】:

    【解决方案2】:
    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;
                    }
                }
    

    要创建此 VM,您必须对此拥有适当的权限。您必须至少添加为该资源组的贡献者。

    【讨论】:

    • 对不起@JoyWang,我道歉。现在我接受了你的回答。我犯了那个错误是因为我希望如果有人想在 c# 中做同样的事情,那么这是一个完整的例子(我的)。
    • 好吧,我赞成你的答案,我想其他人会找到它。
    【解决方案3】:
    1. 您可以从 Azure 门户获取租户 ID。您可以通过以下方式找到它:Azure Active Directory -> 属性 -> 目录 ID。但是,在大多数情况下,您可以只使用您的租户名称,它是您帐户 ID 中“@”之后的部分。 (***.onmicrosoft.com 或您的自定义域)

    2. 创建 .NEt 框架应用程序并从 nuget 安装 Microsoft.IdentityModel.Clients.ActiveDirectory 包。

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

    然后您可以使用访问令牌调用 Azure REST API。

    更新:

    您收到错误是因为您的管理员启用了 MFA。因此,您将无法使用密码授予流程直接获取令牌。将有 4 种解决方法:

    1. 以交互方式获取令牌。

    2. 使用客户端凭据为您的应用程序获取令牌并管理资源。

    3. 为用户获取一次token,即可获得刷新token。您可以使用它来获取新令牌。 Refreshing the access tokens

    4. 使用乔伊的方式。您可以使用托管标识。

    【讨论】:

    • 我可以从哪里获取客户端 ID。
    • @AbhinavSharma 只需使用 1950a258-227b-4e31-a9cf-717495945fc2。它是 Microsoft 为公众提供的预定义客户端。
    • 此代码不起作用我收到错误:-由于您的管理员进行了配置更改,或者因为您移动到了新位置,您必须注册多因素身份验证才能访问。我已通过我的 clientID。
    • 其次,我无法通过我的凭据。出于测试目的,可以,但对于生产,谁将提供自己的凭据?
    猜你喜欢
    • 2018-04-09
    • 2017-11-04
    • 2020-04-08
    • 1970-01-01
    • 2022-01-19
    • 2021-10-10
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多