API .NetCore 2.2 не удается получить токен из AAD при использовании назначенной пользователю идентификации

Используйте is_numeric () .

is_int() не будет работать, потому что параметры GET всегда являются строками.

1
задан illremember thistime 17 January 2019 в 13:04
поделиться

1 ответ

Похоже, что AzureServiceTokenProvider не поддерживает назначенные пользователем управляемые удостоверения, по крайней мере, на этом этапе. AzureServiceTokenProvder - это оболочка над локальной конечной точкой HTTP, которая предоставляет токены для приложения.

Я изучал это и, похоже, вы должны предоставить clientId конечного пользователя, которому назначен управляемый идентификатор, для получения токена. А у AzureServiceTokenProvider нет способа сделать это (по крайней мере, я мог бы это выяснить).

Назначенные пользователем управляемые идентификаторы добавляют возможность иметь несколько Назначенных пользователем управляемых идентификаторов для приложения. Таким образом, API для получения токена должен указывать, какой MSI вы хотите, назначенный системой MSI или один из назначенных пользователем MSI. Конечная точка HTTP делает это так, что она использует назначенный системой MSI, если вы не укажете clientId.

В любом случае вы можете напрямую подключиться к конечной точке токена и указать clientId назначенного пользователем MSI, например:

public async Task<String> GetToken(string resource, string clientId = null)
{
    var endpoint = System.Environment.GetEnvironmentVariable("MSI_ENDPOINT", EnvironmentVariableTarget.Process);
    var secret = System.Environment.GetEnvironmentVariable("MSI_SECRET", EnvironmentVariableTarget.Process);

    if (string.IsNullOrEmpty(endpoint))
    {
        throw new InvalidOperationException("MSI_ENDPOINT environment variable not set");
    }
    if (string.IsNullOrEmpty(secret))
    {
        throw new InvalidOperationException("MSI_SECRET environment variable not set");
    }

    Uri uri;
    if (clientId == null)
    {
        uri = new Uri($"{endpoint}?resource={resource}&api-version=2017-09-01");
    }
    else
    {
        uri = new Uri($"{endpoint}?resource={resource}&api-version=2017-09-01&clientid={clientId}");
    }

    // get token from MSI
    var tokenRequest = new HttpRequestMessage()
    {
        RequestUri = uri,
        Method = HttpMethod.Get
    };
    tokenRequest.Headers.Add("secret", secret);
    var httpClient = new HttpClient();

    var response = await httpClient.SendAsync(tokenRequest);

    var body = await response.Content.ReadAsStringAsync();
    var result = JObject.Parse(body);

    string token = result["access_token"].ToString();
    return token;

}
0
ответ дан David Browne - Microsoft 17 January 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: