rest - Azure 虚拟机和 REST api 出现问题

标签 rest azure authentication virtual-machine

我正在尝试以编程方式启动 Azure VM(使用管理证书)。我在尝试处理 http 请求时收到此错误:错误 401 未经授权。 (这不是证书错误时出现的错误)。尝试了对同一订阅的其他请求(列出托管服务) - 一切正常,似乎只有当我尝试使用虚拟机时才会出现问题。不知道我做错了什么。代码如下:

 static void Main(string[] args)
    {
        Certificate = new X509Certificate2(Convert.FromBase64String(base64Cer));

        string uriFormat = "https://management.azure.com/subscriptions/{my_sub_id}/resourceGroups/{my_resourse_group}/providers/Microsoft.ClassicCompute/virtualMachines/{my_machine_name}/start?api-version={0}";

        Uri uri = new Uri(string.Format(uriFormat, Version));

        XDocument responseBody;
        HttpWebResponse response = InvokeRequest(uri, "POST", out responseBody);

        HttpStatusCode statusCode = statusCode = response.StatusCode;
        Console.WriteLine("The status of the operation: {0}\n\n", statusCode.ToString());
        Console.WriteLine(responseBody.ToString(SaveOptions.OmitDuplicateNamespaces));


        Console.Write("Press any key to continue:");
        Console.ReadKey();
    }

    private static HttpWebResponse InvokeRequest( Uri uri, string method, out XDocument responseBody)
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
        request.Method = method;
        request.Headers.Add("x-ms-version", Version);
        request.ClientCertificates.Add(Certificate);
        request.ContentType = "application/json";
        request.ContentLength = 0;

        responseBody = null;
        HttpWebResponse response;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
            response = (HttpWebResponse)ex.Response;
        }
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.DtdProcessing = DtdProcessing.Ignore;
        if (response.ContentLength > 0)
        {
            using (XmlReader reader = XmlReader.Create(response.GetResponseStream(), settings))
            {
                try
                {
                    responseBody = XDocument.Load(reader);
                }
                catch
                {
                    responseBody = null;
                }
            }
        }
        response.Close();
        return response;
    }

最佳答案

您收到此错误的原因是您尝试使用 X509 证书对 Azure 资源管理器 (ARM) API 请求进行身份验证/授权。 ARM API 的授权需要基于 Azure AD 的授权 token 。请参阅此链接以验证/授权 ARM API 请求:https://msdn.microsoft.com/en-us/library/azure/dn790557.aspx .

基于 X509 证书的身份验证/授权仅适用于经典服务管理 API 请求。

关于rest - Azure 虚拟机和 REST api 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570328/

相关文章:

Spring Boot 2.Hikari连接池优化

spring - 使用 Spring MVC 和 REST 提交表单时出现错误

java - 我可以将 REST 请求转发到其他资源吗?

javascript - JS框架能够基于(django)rest api选项生成表单

java - 使用 EJB 注入(inject)用户实体

azure - 部署到 Azure 时 Service Fabric 应用程序没有响应

asp.net - 是否可以在 AZURE 的同一个网站门户中部署 WCF 服务和网站?

java - 如何使用java代码将文件作为blob从互联网上传到azure存储?

azure - 是否可以使用 MSAL 获取 Azure AD V1 token ?

http - 如果我将 session 存储在 localStorage 而不是 cookie 中,我的网站会更安全吗?