gpt4 book ai didi

Azure 身份 : Trying to get GetUserDelegationKey to work with an application Service Principal

转载 作者:行者123 更新时间:2023-12-02 07:58:23 25 4
gpt4 key购买 nike

当我询问的方法 GetUserDelegationKey 在 SO 上产生零搜索结果时,这不是一个好兆头。祝我好运。

我有一个 C# 控制台应用程序 .Net Framework 4.8,使用 Azure.Storage.Blobs 和 Azure.Identity,它将在客户服务器上运行并访问 Azure Blob 存储来保存一些内容。我正在使用库完成所有这些工作,而不是滚动我自己的 REST。使用VS2019构建,在Win10上测试。

计划是使用我拥有的一个 Azure 存储帐户,并使用每个客户的凭据为每个客户项目创建一个容器,这些凭据仅允许他们使用自己的容器。项目永远不会互相交谈。

我可以在 Azure 门户中手动设置凭据,但我顽固地尝试在软件中执行此操作,其中一个简单的项目管理应用程序作为项目应用程序的服务主体(我在 Azure AD 中定义)进行连接,创建容器,然后创建具有有限生命周期的共享访问签名。

然后将在客户服务器上配置存储帐户名称/容器名称/访问签名。

我过得很糟糕。

注意:这是使用较新的 BlobClient 机制,而不是较旧的 CloudBlob 机制。不知道这是否重要。

这一切都有记录here at Microsoft ,即使是简单的例子也会让我遇到同样的失败。

using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Identity;

namespace Azure.Test
{
class Program
{
static void Main(string[] args)
{
var serviceClient = new BlobServiceClient(
new Uri("https://stevestorageacct.blob.core.windows.net"),
new DefaultAzureCredential(true)); // true=pop up login dlg

/*BOOM*/ UserDelegationKey key = serviceClient.GetUserDelegationKey(
DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddDays(30));

// use the key to create the signatures
}
}
}

尽管这个程序再简单不过了,但每次调用 GetUserDelegationKey 时都会失败,并出现 XML 错误

Unhandled Exception: Azure.RequestFailedException: The value for one of the XML nodes is not in the correct format.
RequestId:c9b7d324-401e-0127-4a4c-1fe6ce000000
Time:2020-05-01T00:06:21.3544489Z
Status: 400 (The value for one of the XML nodes is not in the correct format.)
ErrorCode: InvalidXmlNodeValue

发送的 XML 应该非常简单,我认为只是有效性的开始/结束日期,但我不知道如何访问它进行检查,并且 http 被禁止这种调用,所以不用Wireshark。

当我使用应用程序的服务主体时,它也会以同样的方式失败:

        static void Main(string[] args)
{
var tokenCredential = new ClientSecretCredential(
"xxxx-xxxx-xxxx-xxxxx", // tenant ID
"yyyy-yyyy-yyyy-yyyyy, // application ID
"**************"); // client secret

var serviceClient = new BlobServiceClient(
new Uri("https://stevestorageacct.blob.core.windows.net"),
tokenCredential);

UserDelegationKey key = serviceClient.GetUserDelegationKey(
DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddDays(30));
// ALSO: boom

我真的很迷茫。

我想我可以尝试滚动我自己的 REST 并以这种方式玩它,但感觉这不是必要的:即使我做错了什么,这种错误感觉就像一个错误。 XML 节点?

也愿意接受完全不同的方法来解决这个问题,如果它们更优秀的话,但至少想找出为什么会失败。

最佳答案

我也遇到过一些问题。首先要尝试的是删除开始时间(传递 null)或将其设置为过去 15 分钟左右。这是为了避免请求计算机和 Azure 服务器之间的时钟偏差。

要验证的第二件事是您使用的用户在存储帐户上具有“存储 Blob 数据贡献者”角色。我最终必须在存储帐户级别授予它,否则它就拒绝为我工作。但是,在您的用例中,您可能需要在容器级别授予它,以允许每个客户端拥有一个容器。

希望这有帮助。

关于Azure 身份 : Trying to get GetUserDelegationKey to work with an application Service Principal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61535179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com