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

问题描述

最近使用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 显然是认证问题,我尝试过两种认证方式:

  1. AAD。 参考 https://msdn.microsoft.com/en-us/library/azure/dn722415.aspx
  2. 使用 Azure Management Certificate。 (稍后详述)
通过Fiddler 抓包发现,尽管以上两种方法都是抛出 ForbiddenError, 但是第一种方式返回的Status code 是401 Unauthorized,而第二种方式返回的是403 Forbidden。说明在使用AAD 的过程中,身份验证就没有通过,而使用Azure Management Cert 可以通过验证,但是权限不足。于是重新梳理了下第二种方式的认证过程:
  1. 生成自签名证书。
    #生成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"

  2. 将生成的 pfx 证书安装到 “Current User” -> "Personal" 下面。
    解决Azure Management API ForbiddenError: The server failed to authenticate the request_第1张图片

  3. 登陆Windows Azure management portal (https://manage.windowsazure.cn/),进入“Setting”->"Management Certificates" 菜单下,点击Upload,上传test.cer。
    解决Azure Management API ForbiddenError: The server failed to authenticate the request_第2张图片

  4. 在项目中添加如下代码,生成credential。
    X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    certStore.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection certs = certStore.Certificates.Find(X509FindType.FindByThumbprint, "CertThumbPrint", false);
    
    if (certs.Count == 0)
    {
        return null;
    }
    else
    {
        return credential = new CertificateCloudCredentials("SubScriptionID", cert);
    }

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

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

  8. 在 General 下,确保选择了 ”Enable all purposes for this certificate". 
    解决Azure Management API ForbiddenError: The server failed to authenticate the request_第3张图片

  9. 在Extended Validation 菜单下,确保证书的OID 不为空。
    解决Azure Management API ForbiddenError: The server failed to authenticate the request_第4张图片

当做完 7~9, forbidden error 就消失了。我查了下资料,好像是Azure 的内部逻辑会check 证书的OID,一旦发现为空,就直接forbidden,真是恶心啊。

你可能感兴趣的:(问题总结)