如何使用 C# 获取 azure 服务主体的不记名令牌
How to obtain bearer token for azure service principal with C#
我需要获取服务主体的不记名访问令牌。我想在 C# 应用程序中使用它。
我已经有了principal Id和secret 以及tenant id,如何获取?
编辑:
更加具体:
我有 client_id
和 client_secret
的服务主体。
我可以使用以下命令通过 azure cli 获取不记名令牌
az login --service-principal -u client_id --tenant my_tenant_domain -p client_secret
az account set --subscription my_subscription_id
az account get-access-token
我想在不使用 CLI 的情况下获得相同的令牌,即使用 Azure SDK 进行 dot net 或 rest 调用
当前最好的方法是使用 Microsoft.Azure.Services.AppAuthentication package, as it supports Managed Service Identities 以及 Service Prinicpals。
参见,例如,Service-to-service authentication to Azure Key Vault using .NET
.对于其他服务,您可以遵循相同的过程,根据需要更改请求的资源 https://management.azure.com/
。
我得到了以下代码:
var adSettings = new ActiveDirectoryServiceSettings
{
AuthenticationEndpoint = new Uri(AzureEnvironment.AzureGlobalCloud.AuthenticationEndpoint),
TokenAudience = new Uri(AzureEnvironment.AzureGlobalCloud.ManagementEndpoint),
ValidateAuthority = true
};
await ApplicationTokenProvider.LoginSilentAsync(
TenantId.Value,
ServicePrincipalId,
ServicePrincipalSecret,
adSettings,
TokenCache.DefaultShared);
var token = TokenCache.DefaultShared.ReadItems()
.Where(t => t.ClientId == ServicePrincipalId)
.OrderByDescending(t => t.ExpiresOn)
.First();
我需要获取服务主体的不记名访问令牌。我想在 C# 应用程序中使用它。
我已经有了principal Id和secret 以及tenant id,如何获取?
编辑:
更加具体:
我有 client_id
和 client_secret
的服务主体。
我可以使用以下命令通过 azure cli 获取不记名令牌
az login --service-principal -u client_id --tenant my_tenant_domain -p client_secret
az account set --subscription my_subscription_id
az account get-access-token
我想在不使用 CLI 的情况下获得相同的令牌,即使用 Azure SDK 进行 dot net 或 rest 调用
当前最好的方法是使用 Microsoft.Azure.Services.AppAuthentication package, as it supports Managed Service Identities 以及 Service Prinicpals。
参见,例如,Service-to-service authentication to Azure Key Vault using .NET
.对于其他服务,您可以遵循相同的过程,根据需要更改请求的资源 https://management.azure.com/
。
我得到了以下代码:
var adSettings = new ActiveDirectoryServiceSettings
{
AuthenticationEndpoint = new Uri(AzureEnvironment.AzureGlobalCloud.AuthenticationEndpoint),
TokenAudience = new Uri(AzureEnvironment.AzureGlobalCloud.ManagementEndpoint),
ValidateAuthority = true
};
await ApplicationTokenProvider.LoginSilentAsync(
TenantId.Value,
ServicePrincipalId,
ServicePrincipalSecret,
adSettings,
TokenCache.DefaultShared);
var token = TokenCache.DefaultShared.ReadItems()
.Where(t => t.ClientId == ServicePrincipalId)
.OrderByDescending(t => t.ExpiresOn)
.First();