您的位置:首页 > 产品设计 > UI/UE

解决Azure Management API ForbiddenError: The server failed to authenticate the request

2015-11-03 11:36 489 查看

问题描述

最近使用Windows Azure Management Libraries (Nuget:https://www.nuget.org/packages/Microsoft.WindowsAzure.Management.Libraries)管理Mooncake 里的Azure
Service, 发现一直出现以下错误:

ForbiddenError: The server failed to authenticate the request. Verify that the certificate is valid and is associated with this subscription.

解决方案

在网上找了寻求帮助时,发现有很多朋友碰到同样的问题,解决方法各异,但是在我的机器上都不奏效。今天早晨终于一番尝试,成功地解决问题,记录如下:

ForbiddenError 显然是认证问题,我尝试过两种认证方式:

AAD。 参考 https://msdn.microsoft.com/en-us/library/azure/dn722415.aspx
使用 Azure Management Certificate。 (稍后详述)

通过Fiddler 抓包发现,尽管以上两种方法都是抛出 ForbiddenError, 但是第一种方式返回的Status code 是401 Unauthorized,而第二种方式返回的是403 Forbidden。说明在使用AAD 的过程中,身份验证就没有通过,而使用Azure Management Cert 可以通过验证,但是权限不足。于是重新梳理了下第二种方式的认证过程:

生成自签名证书。

#生成pvk
Makecert.exe -sv test.pvk -n "cn=Self signed" test.cer -b 10/20/2015 -e 10/20/2017 -r

#生成pfx
pvk2pfx -pvk ./test.pvk -spc ./test.cer -pfx ./test.pfx -po "Your_Password"


将生成的 pfx 证书安装到 “Current User” -> "Personal" 下面。



登陆Windows Azure management portal (https://manage.windowsazure.cn/),进入“Setting”->"Management Certificates" 菜单下,点击Upload,上传test.cer。



在项目中添加如下代码,生成credential。
X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = certStore.Certificates.Find(X509FindType.FindByThumbprint, "<em>CertThumbPrint</em>", false);

if (certs.Count == 0)
{
return null;
}
else
{
return credential = new CertificateCloudCredentials("<em>SubScriptionID</em>", cert);
}




创建Management Client 操作Azure Service。注意:MAML 默认使用Globle Azure 的management endpoint,如果是使用Mooncake,需要在client 的第二个参数显式地指定endpoint —— var' target='_blank'>https://management.core.chinacloudapi.cn。[code=csharp]var websiteClient = new WebSiteManagementClient(credential, new Uri(ConfigurationManager.AppSettings["apiEndpoint"]));
做完这一步后,若运行程序,则会产生403 forbidden error。若要解决该错误,还需要。

Win+Run 在打开的窗口中输入MMC,打开“Current User”-> "Personal“ 下的证书。右击我们上面安装的证书 test.pfx,点击 Property。

在 General 下,确保选择了 ”Enable all purposes for this certificate".



在Extended Validation 菜单下,确保证书的OID 不为空。



当做完 7~9, forbidden error 就消失了。我查了下资料,好像是Azure 的内部逻辑会check 证书的OID,一旦发现为空,就直接forbidden,真是恶心啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: