仅在部署到IIS后Azure API出现403错误

本文关键字:API 出现 错误 Azure 部署 IIS | 更新日期: 2023-09-27 18:09:05

我想我已经阅读了互联网上关于这一点的每一件事(我知道粗体声明),但我不能解决它…

我有一个非常简单的网页,获得Azure上的状态vm,这在我的机器上工作得很好。我用makecert在我的本地机器上创建了一个证书,调试运行良好。在将它部署到IIS上的另一台服务器后,我得到的是403个错误。

我尝试过的事情:

  1. 使用私钥从我的开发机器导出证书并导入到测试服务器
  2. 使用makecert创建新证书(编辑:在我想要部署到的服务器上重新创建证书)(根据MSN的此链接),上传到Azure,更新代码以搜索新的指纹,重新部署并欣赏相同的错误消息..
  3. 两次我都将应用程序池身份更改为可登录(和恢复)的用户帐户
  4. 尝试使用证书作为本地机器和当前用户,并在应用程序池中更新用户

我改变了我的get证书代码,更像一个类似的问题的答案,但发现证书似乎不是问题。如果我删除在服务器上创建的证书,我得到一个不同的错误。

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);  
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var certificate = store.Certificates.Cast<X509Certificate2>().SingleOrDefault(c => string.Equals(c.Thumbprint, thumbprint, StringComparison.OrdinalIgnoreCase));  // please replace CertificateThumbprint with original Thumbprint
        return certificate;

参考:如何在IIS中通过c#连接到azure (management) rest api

创建HttpClient的代码:
WebRequestHandler handler = new WebRequestHandler();
String CertThumbprint = _certthumbprint;
X509Certificate2 managementCert = FindX509Certificate(CertThumbprint);
if (managementCert != null)
{
   handler.ClientCertificates.Add(managementCert);
   HttpClient httpClient = new HttpClient(handler);
   httpClient.DefaultRequestHeaders.Add("x-ms-version", "2014-05-01");
   httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
            return httpClient;
        }

检索虚拟机代码:

String uri = String.Format("https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}", _subscriptionid, ServiceName, "Production");
            XDocument vms = new XDocument();
            vms.Add(new XElement("VirtualMachines"));
            ApplyNamespace(vms.Root, ns);
            try
            {
                HttpClient http = GetHttpClient();
                Stream responseStream = await http.GetStreamAsync(uri);
                if (responseStream != null)
                {
                    XDocument xml = XDocument.Load(responseStream);
                    var roles = xml.Root.Descendants(ns + "RoleInstance");
                    foreach (XElement r in roles)
                    {
                        XElement svcNamee1 = new XElement("ServiceName", ServiceName);
                        ApplyNamespace(svcNamee1, ns);
                        r.Add(svcNamee1);
                        vms.Root.Add(r);
                    }
                }
            }

这段代码目前大约95%是从这里复制粘贴的

仅在部署到IIS后Azure API出现403错误

在这种情况下,我的解决方案是通过powershell创建一个新的Publishsettings文件,并通过powershell将其导入服务器。然后在代码中使用那个指纹。由于某种原因,在服务器上制作证书并上传到Azure仍然无法工作…