【问题标题】:How to authenticate with Azure Resource Manager using managed identity in C#如何使用 C# 中的托管标识向 Azure 资源管理器进行身份验证
【发布时间】:2020-11-12 18:07:35
【问题描述】:

我正在尝试使用 managedIdentity 来获取一个令牌,然后我可以使用它来列出资源组中的资源。尝试获取令牌时出现错误。 GetToken() api 似乎在内部将其他字符串(offline_access openid)添加到我提供的范围内,但该范围不是有效的 url 失败。从错误来看,我似乎没有正确使用 api。但我也在关注文档。有人可以帮助追踪我的代码中的问题。

代码:

var managedIdentityCredential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = managedIdentityId });
var azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=App");
AccessToken accessToken = managedIdentityCredential.GetToken(new TokenRequestContext(new string[] { "https://management.azure.com/" }));

错误: Azure.Identity.AuthenticationFailedException:SharedTokenCacheCredential 身份验证失败。 ---> Microsoft.Identity.Client.MsalServiceException:AADSTS70011:提供的请求必须包含“范围”输入参数。为输入参数“范围”提供的值无效。范围https://management.azure.com/offline_access openid 配置文件无效。范围格式无效。范围必须采用有效的 URI 形式 https://example/scope 或有效的 Guid

【问题讨论】:

    标签: c# azure azure-managed-identity


    【解决方案1】:

    要使用 MSI(托管身份)获取令牌,请确保您在 Azure services that support the managed identity 中运行代码。

    为服务启用系统分配的 MSI 后,直接使用下面的代码。

    var azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=App");
    string accessToken = azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/").Result;
    Console.WriteLine(accessToken)
    

    【讨论】:

    • 您好,如果对您有帮助,请将其标记为答案,只需点击i.stack.imgur.com/LkiIZ.png之类的选项,谢谢。
    • 感谢@joywang 的回复。当我运行您的代码时,我收到一个异常:AzureServiceTokenProviderException,并显示消息“尝试使用托管服务标识获取令牌。无法获取访问令牌。发送请求时出错。”。此错误是可以理解的,因为执行代码的帐户不是托管身份本身,而是被授予访问控制 (IAM) 访问权限的 AD 应用程序,以访问托管身份上的“托管应用程序操作员角色”角色。托管标识反过来对我希望访问的资源组具有读者访问权限。
    • 也许令牌是错误的东西。这是访问密钥保管库的示例:` var mICredential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = managedIdentityId });新 SecretClient(新 Uri(keyVault.VaultUri),mICredential); ` 以类似的方式,我如何想出一个示例来列出托管标识有权访问的资源组中的资源?
    • 在这种情况下,我通过模拟器在本地运行以测试日内瓦操作(它通过作为 AD 应用程序执行,我们必须授予对我的 Azure 资源(如密钥保管库和天蓝色资源)的角色访问权限组)。
    • @SharathMalladi 如果您在本地运行代码,为什么需要使用 MSI? MSI 将无法在本地工作,我在回复的第一行中提到了这一点。如果您想在本地运行代码以获取令牌,您可以使用 VS 身份验证或服务主体直接进行身份验证,例如如果您使用服务主体,请使用var azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret}"); 修改代码,请参阅docs.microsoft.com/en-us/azure/key-vault/general/…
    猜你喜欢
    • 2021-12-23
    • 2019-09-08
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多