Azure 生成本地运行的用户委派SAS令牌

Azure 生成本地运行的用户委派SAS令牌,azure,asp.net-core,azure-storage,azure-blob-storage,azure-managed-identity,Azure,Asp.net Core,Azure Storage,Azure Blob Storage,Azure Managed Identity,我正在基于此[文档][1]创建解决方案。我让它几乎可以按照我想要的方式工作,但它只有在部署到Azure时才能工作。应用程序服务已配置托管标识,并已将其分配给存储Blob数据参与者角色。有没有办法让它在我的本地机器上运行?目前我需要将代码从VS发布到Azure,然后使用远程调试来验证它是如何工作的。 这是有问题的一行: userDelegationKey key = await blobClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,

我正在基于此[文档][1]创建解决方案。我让它几乎可以按照我想要的方式工作,但它只有在部署到Azure时才能工作。应用程序服务已配置托管标识,并已将其分配给
存储Blob数据参与者
角色。有没有办法让它在我的本地机器上运行?目前我需要将代码从VS发布到Azure,然后使用远程调试来验证它是如何工作的。 这是有问题的一行:

userDelegationKey key = await blobClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
   DateTimeOffset.UtcNow.AddDays(7));
我得到一个例外:

Status: 400 (The value for one of the XML nodes is not in the correct format.)
ErrorCode: InvalidXmlNodeValue
我使用了
DefaultAzureCredentials
,在调试中我看到它有3个不同的源代码。首先是
EnvironmentCredential
(然后是
ManagedEntityCredential
SharedTokenCacheCredential
)。所以我尝试在Azure AD中注册应用程序,并配置了这3个环境变量,但都没有用。也许我需要向这个应用程序添加一些特定的权限

"AZURE_CLIENT_ID": "",
"AZURE_CLIENT_SECRET": "",
"AZURE_TENANT_ID": ""
或者这可能与我在Azure中的帐户一起工作?如果我还被分配了
存储Blob数据参与者
角色

编辑:我用Fiddler捕获了请求和响应

请求:

POST https://myaccount.blob.core.windows.net/?restype=service&comp=userdelegationkey HTTP/1.1
Host: myaccount.blob.core.windows.net
x-ms-version: 2019-07-07
x-ms-client-request-id: 23071825-dcf0-4803-a8a9-c44ec38695d5
x-ms-return-client-request-id: true
User-Agent: azsdk-net-Storage.Blobs/12.4.4 (.NET Core 3.1.2; Microsoft Windows 10.0.16299)
Authorization: Bearer Hidden
traceparent: 00-7e23f80250325742853c846211a83d02-6739d4cbc8ef0a46-00
Content-Type: application/xml
Content-Length: 91

<KeyInfo><Start>2020-07-08T06:02:35Z</Start><Expiry>2020-07-15T06:17:35Z</Expiry></KeyInfo>
HTTP/1.1 400 The value for one of the XML nodes is not in the correct format.
Content-Length: 348
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: ba2fe641-f01e-0065-3eef-54acae000000
x-ms-client-request-id: 23071825-dcf0-4803-a8a9-c44ec38695d5
x-ms-version: 2019-07-07
x-ms-error-code: InvalidXmlNodeValue
Date: Wed, 08 Jul 2020 06:16:14 GMT

<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidXmlNodeValue</Code><Message>The value for one of the XML nodes is not in the correct format.
RequestId:ba2fe641-f01e-0065-3eef-54acae000000
Time:2020-07-08T06:16:15.7553428Z</Message><XmlNodeName>2020-07-15T06:17:35Z</XmlNodeName><XmlNodeValue>2020-07-15T06:17:35Z</XmlNodeValue></Error>
编辑2: 它在@JimXu的帮助下工作。此外,我还可以在VisualStudio中配置Azure帐户,这样我就可以删除我在Azure AD中为此目的创建的应用程序注册。
[1] :

如果要获取Azure存储帐户用户委派密钥,需要将
存储Blob数据贡献者
存储Blob数据所有者
存储Blob委托者
分配给AD应用程序或帐户。有关更多详细信息,请参阅

此外,请注意,当我们获得Azure存储帐户用户委派密钥时,我们需要提供过期时间。其值必须是当前时间后7天内的有效日期和时间。有关更多详细信息,请参阅

比如说

string accountName = "jimtestdiag417";

            string blobEndpoint = $"https://{accountName}.blob.core.windows.net/";
            

            // Create a new Blob service client with Azure AD credentials.  
            BlobServiceClient blobClient = new BlobServiceClient(new Uri(blobEndpoint),
                                                                    new DefaultAzureCredential();

            // Get a user delegation key for the Blob service that's valid for seven days.
            // to avoid clock skew between the requesting pc and azure servers, please set expire time in future six days
            UserDelegationKey key = await blobClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                                                DateTimeOffset.UtcNow.AddDays(6));

            // Read the key's properties.
            Console.WriteLine("User delegation key properties:");
            Console.WriteLine("Key signed start: {0}", key.SignedStartsOn);
            Console.WriteLine("Key signed expiry: {0}", key.SignedExpiresOn);
            Console.WriteLine("Key signed object ID: {0}", key.SignedObjectId);
            Console.WriteLine("Key signed tenant ID: {0}", key.SignedTenantId);
            Console.WriteLine("Key signed service: {0}", key.SignedService);
            Console.WriteLine("Key signed version: {0}", key.SignedVersion);
            Console.WriteLine();

FYI-删除了SAS标记,因为我认为这与软件SAS无关。如果您想获得Azure存储帐户用户委派密钥,您需要分配
存储Blob数据参与者
Storage Blob Data Owner
Storage Blob Delegator
分配给AD应用程序或帐户。@JimXu它被分配了
Storage Blob Data Contributor
角色。我在我的帖子中添加了请求作为回应。在此之后,我还删除了那些ENV变量以尝试
SharedTokenCacheCredential
(我的帐户也被分配了正确的角色),但我收到了相同的错误。根据您提供的响应,过期日期似乎超过了7天。请将代码更新为
blobClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,DateTimeOffset.UtcNow.AddDays(6))
@JimXu成功了!谢谢但是你能解释一下你在哪里看到它吗?但是文档上说:
UserDelegationKey=wait blobClient.getuserdelegationkeyanc(DateTimeOffset.UtcNow,DateTimeOffset.UtcNow.AddDays(7))-这不是7天,因为您获得了两次
DateTimeOffset.UtcNow
。它在Azure上工作,而不是在本地计算机上。有什么区别?@PiotrPerak您的本地区域和Azure存储数据中心区域可能不同。当您将请求发送到Azure storage data center时,时间会经过一些处理。可能就是这样。当我改为
DateTimeOffset.UtcNow.AddDays(7.AddHours(-2)
时,它也可以工作。