MSDN Library

对服务管理请求进行身份验证

更新时间: 2015年6月

必须使用以下方法之一对管理服务请求进行身份验证:

可以通过创建一个 Azure AD 应用程序,并使用 Active Directory Authentication Library从该应用程序获取访问令牌,来针对向管理服务发出的安全请求进行身份验证。有关使用 Azure AD 进行身份验证的详细信息,请参阅 Azure AD 的身份验证方案

执行以下操作可将应用程序添加到 Azure AD:

  1. 登录到 Azure 管理门户。

  2. 在左侧菜单的底部,单击“Active Directory”,然后单击“默认目录”。

  3. 在“默认目录”页上的“集成应用程序”下面,单击“添加你要开发的应用程序”。

    添加 Azure AD 应用程序
  4. 输入应用程序的名称,选择“本机客户端应用程序”,然后单击右箭头。

    提供应用程序的名称
  5. 输入应用程序的 URI,然后单击复选标记。该 URI 包含前缀为 http://localhost/ 的应用程序名称。

    输入重定向 URL
  6. 创建应用程序后,必须添加对该应用程序的权限才能访问服务管理 API。转到应用程序对应的页面,然后单击“配置”。

  7. 在配置页底部的“对其他应用程序的权限”部分中,单击“选择应用程序”,然后选择“Microsoft Azure 服务管理 API”。

    向应用程序分配权限
  8. 单击“委托的权限:0,然后选择“访问 Azure 服务管理”。

    继续设置权限
  9. 在底部菜单中单击“保存”。

可以使用 NuGet 包在 Visual Studio 项目中轻松安装 Active Directory Authentication Library。若要安装该包,请执行以下操作:

  1. 在解决方案资源管理器中右键单击项目名称,然后单击“管理 NuGet 包”。

    管理 NuGet 包
  2. 在搜索框中键入 Active Directory,单击“Active Directory 身份验证库”包旁边的“安装”,然后根据说明安装该包。

    安装 Active Directory 库

以下代码示例演示了如何检索访问令牌:


private static string GetAuthorizationHeader()
{
  AuthenticationResult result = null;
  
  var context = new AuthenticationContext("https://login.windows.net/{tenantId}");

  var thread = new Thread(() =>
  {
    result = context.AcquireToken(
      "https://management.core.windows.net/",
      "{clientId}",
      new Uri("{redirectUri}"));
  });

  thread.SetApartmentState(ApartmentState.STA);
  thread.Name = "AquireTokenThread";
  thread.Start();
  thread.Join();
            
  if (result == null)
  {
    throw new InvalidOperationException("Failed to obtain the JWT token");
  }

  string token = result.AccessToken;
  return token;
}

使用上面列出的代码时,需要进行以下替换:

  • {tenantId} 替换为应用程序的 GUID。若要查找该 GUID,请在管理门户的“Active Directory”部分中转到“默认目录”页,选择前面创建的应用程序,然后单击“查看终结点”。

    查看终结点

    复制该应用程序的 GUID,然后将占位符替换为该 GUID。

    复制应用程序终结点
  • {clientId} 替换为客户端标识符。若要查找客户端标识符,请在管理门户中,转到应用程序的“配置”页。

    复制 AD 客户端 ID
  • {redirectUri} 替换为重定向 URI。若要查找重定向 URI,请在管理门户中,转到应用程序的“配置”页。

    复制应用程序重定向 URI

使用以下代码行将上面所示 GetAuthorizationHeader 方法返回的令牌分配给请求可以使用的变量:

string token = GetAuthorizationHeader();

使用以下代码行将该令牌添加到请求:


HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);

可以使用管理证书通过 SSL 来针对向管理服务发出的安全请求进行身份验证。若要使用管理证书,必须将其上载到 Azure。向订阅添加管理证书后,即可使用该证书对服务请求进行签名。有关创建管理证书和将其与订阅关联的信息,请参阅创建并上载 Azure 的证书

设计应用程序时,请记住有关管理证书的以下几点:

  • 服务管理 API 不验证证书是否仍有效。对于过期的证书,身份验证将成功。

  • 所有管理证书均携带同样一组权限。在一个角色中配置一个管理证书,而在一个不同的角色中配置同一订阅上的另一个证书时,没有“基于角色”的身份验证这一概念。

以下示例显示如何使用 System.NetSystem.Security.Cryptography.X509Certificates 库检索管理证书:


private static X509Certificate2 GetStoreCertificate(string thumbprint)
{
  List<StoreLocation> locations = new List<StoreLocation>
  { 
    StoreLocation.CurrentUser, 
    StoreLocation.LocalMachine
  };

  foreach (var location in locations)
  {
    X509Store store = new X509Store("My", location);
    try
    {
      store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
      X509Certificate2Collection certificates = store.Certificates.Find(
        X509FindType.FindByThumbprint, thumbprint, false);
      if (certificates.Count == 1)
      {
        return certificates[0];
      }
    }
    finally
    {
      store.Close();
    }
  }
  throw new ArgumentException(string.Format(
    "A Certificate with Thumbprint '{0}' could not be located.",
    thumbprint));
}

使用以下代码行将上面所示 GetStoreCertificate 方法返回的证书分配给请求可以使用的变量:

note备注
Thumbprint表示已添加到订阅中的管理证书的指纹。


X509Certificate2 certificate = GetStoreCertificate(Thumbprint);

使用以下代码行将该证书添加到请求:


HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.ClientCertificates.Add(certificate);

显示:
© 2016 Microsoft