2

我在我的应用程序中使用 azure 服务管理 REST API。我在 azure 上上传了管理证书,并在本地有一份副本。我将认证保存在应用程序本身的单独文件夹 (AzureCertificate) 中,并引用该位置。例如:

string certificatePath = Server.MapPath("~/AzureCertificate/") + certificateName;

X509Certificate2 证书 = 新 X509Certificate2(certificatePath);

AzureCertificate -- 文件夹名称 certificateName - MyCertificateName.cer

当我在本地开发环境中运行应用程序时,它工作正常。但是当我在 azure 网站中部署相同的内容时,我得到了以下错误。

远程服务器返回错误:(403) Forbidden

这就是我提出请求的方式

字符串 uri = apiURL + subscriptionId + "/services/hostedservices";

HttpWebRequest 请求 = (HttpWebRequest)HttpWebRequest.Create(uri);

X509Certificate2 证书 = 新 X509Certificate2(certificatePath);

req.ClientCertificates.Add(证书);

req.Headers.Add("x-ms-version", "2009-10-01"); HttpWebResponse res =

(HttpWebResponse)req.GetResponse();

但它在最后一行 (req.GetResponse()) 抛出上述异常。

我们可以这样使用管理证书吗?

我的要求是开发一个使用 azure REST API 并在 azure 中部署的应用程序。

4

2 回答 2

1

我还发现,以与 Management API 一起使用的正确方式创建证书非常重要 - 在我使用此脚本创建证书之前,我遇到了 403 错误:

makecert -r -pe -a sha1 -n "CN=Windows Azure Authentication Certificate" -ss my -len 2048 -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 ManagementApiCert.cer

我在这里得到了:http: //blogs.msdn.com/b/davidhardin/archive/2013/08/27/azure-management-certificate-public-key-private-key.aspx这是几年前的但是当我尝试过的其他较新的没有时,为我工作。

此外,请确保您在门户设置中的管理证书下上传证书,它不是 SSL 或远程访问证书。

于 2016-01-01T08:13:52.063 回答
0

我建议使用 Azure 管理 SDK。您可以从名为Microsoft.WindowsAzure.Management的 nuget 包安装它,并使用适当的类/方法来执行您想要执行的操作。

如果您确实需要直接通过 HTTP 和 REST API 执行某些操作,我建议您使用HttpClient而不是HttpWebRequest. (是另一个名为Microsoft.Net.HttpHttpClient的 nuget 包。然后您可以使用(通过属性)为您填充 HTTP 请求。例如:SubscriptionCloudCredntialsManagementClient.Credentials

var client = new ManagementClient(
    new CertificateCloudCredentials(subscriptionId, certificate));
//...
var requestMessage = new HttpRequestMessage(HttpMethod.Get, apiURL);
await client.Credentials.ProcessHttpRequestAsync(requestMessage,
    CancellationToken.None);
var httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.SendAsync(requestMessage);
// TODO: process response, maybe:
var responseText = response.AsString();

我建议尽可能使用client

于 2014-09-30T17:53:21.490 回答