教程:使用 Windows VM 系统分配的托管标识访问 Azure 存储

Azure 资源的托管标识是 Azure 活动目录的一项功能。支持Azure 资源的托管标识的每个 Azure 服务都受其自己的时间线的监视。请确保在开始之前查看资源的托管标识的可用性状态和已知问题。yB9码友部落

本教程介绍如何使用系统分配的 Windows 虚拟机 (VM) 托管标识访问 Azure 存储。yB9码友部落
yB9码友部落
您学习如何:yB9码友部落

  • 在存储帐户中创建 Blob 容器
  • 授予 Windows VM 的系统分配的存储帐户的托管标识访问权限
  • 获取访问权限并使用它调用 Azure 存储

 注意yB9码友部落

Azure 存储的 Azure 活动目录身份验证位于公共预览版中。yB9码友部落

先决条件

  • 如果您不熟悉 Azure 资源功能的托管标识,请参阅此概述。
  • 如果没有 Azure 帐户,请先注册免费帐户,然后再继续。
  • 若要执行所需的资源创建和角色管理,您的帐户需要在适当的范围内(您的订阅或资源组)获得"所有者"权限。如果需要有关角色分配的帮助,请参阅使用基于角色的访问控制来管理对 Azure 订阅资源的访问。

使

启用系统分配的托管标识是一键式体验。您可以在创建 VM 期间或在现有 VM 的属性中启用它。yB9码友部落

Screenshot shows the System assigned tab for a virtual machine where you can turn on the System assigned status.yB9码友部落

若要在新 VM 上启用系统分配的托管标识,请执行:yB9码友部落

  1. 登录到 Azure 门户yB9码友部落

  2. 创建启用系统分配标识的虚拟机yB9码友部落

授予访问权限

创建存储帐户

在本节中,您将创建一个存储帐户。yB9码友部落

  1. 单击" 创建 Azure门户左上角的资源"按钮。yB9码友部落

  2. 单击"存储",然后单击存储帐户 - Blob、文件、表、队列yB9码友部落

  3. "名称"下,输入存储帐户的名称。yB9码友部落

  4. 部署模型帐户类型应设置为资源管理器和存储(通用 v1)。yB9码友部落

  5. 确保订阅和资源组与在上一步中创建 VM 时指定的组匹配。yB9码友部落

  6. 单击"创建"。yB9码友部落

    Create new storage accountyB9码友部落

创建 Blob 容器并将文件上载到存储帐户

文件需要 Blob 存储,因此您需要创建一个 Blob 容器来存储文件。然后将文件上载到新存储帐户中的 Blob 容器。yB9码友部落

  1. 导航回新创建的存储帐户。yB9码友部落

  2. Blob 服务下,单击"容器"。yB9码友部落

  3. 单击页面顶部的 " 容器"。yB9码友部落

  4. "新容器"下,输入容器的名称,在"公共访问"级别下保留默认值。yB9码友部落

    Create storage containeryB9码友部落

  5. 使用您选择的编辑器,创建一个名为 hello 世界.txt本地计算机上的文件。打开文件,添加文本(不带引号)"你好:)",然后保存它。yB9码友部落

  6. 通过单击容器名称,然后上载文件将文件上载到新创建的容器yB9码友部落

  7. 在"上传"Blob窗格,在"文件"下,单击文件夹图标hello_world.txt浏览到本地计算机上的文件,选择该文件,然后单击"上传"。Upload text fileyB9码友部落

授予访问权限

本节介绍如何授予对 Azure 存储容器的 VM 访问权限。可以使用 VM 的系统分配的托管标识检索 Azure 存储 Blob 中的数据。yB9码友部落

  1. 导航回新创建的存储帐户。yB9码友部落

  2. 单击左侧面板中的访问控制 (IAM)链接。yB9码友部落

  3. 单击"+ 在页面顶部添加角色分配"以为您的 VM 添加新的角色分配。yB9码友部落

  4. "角色"下,从下拉列表中选择"存储 Blob 数据读取器"。yB9码友部落

  5. 下一个下拉列表"分配给 的访问权限"下,选择"虚拟机"。yB9码友部落

  6. 接下来,确保在订阅下拉列表中列出正确的订阅,然后将资源组设置为"所有资源组"。yB9码友部落

  7. "选择"下,选择 VM,然后单击"保存"。yB9码友部落

    Assign permissionsyB9码友部落

存取资料yB9码友部落
 

Azure存储本机支持Azure AD身份验证,因此它可以直接接受使用托管身份获取的访问令牌。 这是Azure存储与Azure AD集成的一部分,与在连接字符串上提供凭据不同。yB9码友部落
yB9码友部落
这是一个.NET代码示例,该示例使用访问令牌打开与Azure存储的连接,然后读取您之前创建的文件的内容。yB9码友部落
此代码必须在VM上运行,才能访问VM的托管身份端点。 使用访问令牌方法需要.NET Framework 4.6或更高版本。 相应地替换值。yB9码友部落
您可以通过导航到创建并上传到Blob存储的文件并在``概述''页面的``属性''下复制URL来获取此值。<URI到Blob文件>yB9码友部落
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace StorageOAuthToken
{
    class Program
    {
        static void Main(string[] args)
        {
            //get token
            string accessToken = GetMSIToken("https://storage.azure.com/");

            //create token credential
            TokenCredential tokenCredential = new TokenCredential(accessToken);

            //create storage credentials
            StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

            Uri blobAddress = new Uri("<URI to blob file>");

            //create block blob using storage credentials
            CloudBlockBlob blob = new CloudBlockBlob(blobAddress, storageCredentials);

            //retrieve blob contents
            Console.WriteLine(blob.DownloadText());
            Console.ReadLine();
        }

        static string GetMSIToken(string resourceID)
        {
            string accessToken = string.Empty;
            // Build request to acquire MSI token
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create
("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=" + resourceID);
            request.Headers["Metadata"] = "true";
            request.Method = "GET";

            try
            {
                // Call /token endpoint
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Pipe response Stream to a StreamReader, and extract access token
                StreamReader streamResponse = new StreamReader(response.GetResponseStream());
                string stringResponse = streamResponse.ReadToEnd();
                JavaScriptSerializer j = new JavaScriptSerializer();
                Dictionary<string, string> list = (Dictionary<string, string>)
j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
                accessToken = list["access_token"];
                return accessToken;
            }
            catch (Exception e)
            {
                string errorText = String.Format("{0} nn{1}", e.Message,
 e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                return accessToken;
            }
        }
    }
}

The response contains the contents of the file:yB9码友部落

Hello world! :)yB9码友部落

禁用

要在VM上禁用系统分配的身份,请将系统分配的身份的状态设置为``关''。yB9码友部落

Screenshot shows the System assigned tab for a virtual machine where you can turn off the System assigned status.yB9码友部落

步骤

在本教程中,您学习了如何启用Windows VM的系统分配的身份来访问Azure存储。 若要了解有关Azure存储的更多信息,请参见:博客相关链接。