gpt4 book ai didi

azure - 使用 Azure AD 和托管标识以编程方式对 AKS 进行身份验证

转载 作者:行者123 更新时间:2023-12-03 03:38:12 25 4
gpt4 key购买 nike

我是 AKS 和 Azure Identity 平台的新手。我有一个使用 Azure AD 集成的 AKS 群集。在具有用户分配的托管标识的 Azure VM 中,我尝试运行 C# 控制台应用程序来针对 Azure AD 进行身份验证,获取 kubeconfig 内容,然后使用 kubernetes 客户端执行一些列表操作。运行下面的代码时,我在尝试执行列表操作时收到未经授权的错误。我已确保在群集访问角色中,分配的托管标识的用户具有所有者角色。

该代码执行以下操作:

  • 使用用户管理的身份 ID 创建 DefaultAzureCredential 实例
  • 将 token 从 DefaultAzureCredential 转换为 Microsoft.Azure.Management.ResourceManager.Fluent.Authentication.AzureCredentials 的实例并进行身份验证
  • 获取经过身份验证的用户的 kubeconfig 内容
  • http://169.254.169.254/metadata/identity/oauth2/token 获取访问 token
  • 在 kubeconfig 上设置访问 token 并创建 Kubernetes 客户端的新实例
  • 尝试列出集群中的命名空间

我已从此 POST 中提取信息以及从这个POST .

我不确定 TokenRequestContext 的范围是否正确以及 oauth token 请求的资源参数是否正确。

string userAssignedClientId = "0f2a4a25-e37f-4aba-942a-5c58f39eb136";
var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId });

var defaultToken = credential.GetToken(new TokenRequestContext(new[] { "https://management.azure.com/.default" })).Token;
var defaultTokenCredentials = new Microsoft.Rest.TokenCredentials(defaultToken);
var azureCredentials = new Microsoft.Azure.Management.ResourceManager.Fluent.Authentication.AzureCredentials(defaultTokenCredentials, defaultTokenCredentials, null, AzureEnvironment.AzureGlobalCloud);
var azure = Microsoft.Azure.Management.Fluent.Azure.Authenticate(azureCredentials).WithSubscription("XXX");

var kubeConfigBytes = azure.KubernetesClusters.GetUserKubeConfigContents(
"XXX",
"XXX"
);

var kubeConfigRaw = KubernetesClientConfiguration.LoadKubeConfig(new MemoryStream(kubeConfigBytes));

var authProvider = kubeConfigRaw.Users.Single().UserCredentials.AuthProvider;
if (!authProvider.Name.Equals("azure", StringComparison.OrdinalIgnoreCase))
throw new Exception("Invalid k8s auth provider!");

var httpClient = new HttpClient();
var token = string.Empty;
using (var requestMessage =
new HttpRequestMessage(HttpMethod.Get, $"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource={Uri.EscapeUriString("6dae42f8-4368-4678-94ff-3960e28e3630/.default")}&client_id={userAssignedClientId}"))
{
requestMessage.Headers.Add("Metadata", "true");

var response = await httpClient.SendAsync(requestMessage);
token = await response.Content.ReadAsStringAsync();

Console.WriteLine(token);
}

var tokenNode = JsonNode.Parse(token);

authProvider.Config["access-token"] = tokenNode["access_token"].GetValue<string>();
authProvider.Config["expires-on"] = DateTimeOffset.UtcNow.AddSeconds(double.Parse(tokenNode["expires_in"].GetValue<string>())).ToUnixTimeSeconds().ToString();

var kubeConfig = KubernetesClientConfiguration.BuildConfigFromConfigObject(kubeConfigRaw);
var kubernetes = new Kubernetes(kubeConfig);

var namespaces = kubernetes.CoreV1.ListNamespace();
foreach (var ns in namespaces.Items)
{
Console.WriteLine(ns.Metadata.Name);
var list = kubernetes.CoreV1.ListNamespacedPod(ns.Metadata.Name);
foreach (var item in list.Items)
{
Console.WriteLine(item.Metadata.Name);
}
}

感谢任何帮助!

最佳答案

尝试在不使用 /.default 的情况下使用 token 请求中的资源。

所以应该是:

resource=6dae42f8-4368-4678-94ff-3960e28e3630

关于azure - 使用 Azure AD 和托管标识以编程方式对 AKS 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72566729/

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