1

特定のユーザー定義 ID の msi トークンを取得しようとしています。私たちのアプリ サービスには 2 つのユーザー定義 ID があり、ユーザー割り当て ID の 1 つに代わってトークンが必要です。

コードは次のとおりです。

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
            "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/&object_id=<ObjectId>&client_id=<clientId>");

        req.Headers["Metadata"] = "true";
        req.Method = "GET";

        try
        {
            // Call /token endpoint
            HttpWebResponse response = (HttpWebResponse)req.GetResponse();

            // Pipe response Stream to a StreamReader, and extract access token
            StreamReader streamResponse = new StreamReader(response.GetResponseStream());
            string stringResponse = streamResponse.ReadToEnd();
            Dictionary<string, string> list =
                 JsonConvert.DeserializeObject<Dictionary<string, string>>(stringResponse);
            string accessToken = list["access_token"];

            System.IO.File.WriteAllText(@".\Log.txt", accessToken);
        }
        catch (Exception e)
        {
            string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
            System.IO.File.WriteAllText(@".\Log.txt", errorText);
            throw;
        }

Azure App Service にデプロイされます。このセクションにアクセスすると、次のエラーが表示されます。アクセス許可によって禁止されている方法でソケットにアクセスしようとしました

http://169.254.169.254に接続して、kudu コンソールを使用してトークンを取得しようとしました。しかし、このエンドポイントにはアクセスできないようです。

ここに画像の説明を入力

Microsoft.Azure.Services.AppAuthentication の AzureServiceTokenProvider を使用して msi トークンを生成しようとしましたが、複数のユーザー割り当て ID に使用する方法に関するドキュメントが見つかりませんでした。

編集:

更新 1:

169.254.169.254 の代わりに MSI_ENDPOINT 環境変数のエンドポイントを使用しようとしました。しかし、アプリ サービスを実行すると、MSI_ENDPOINT 値が設定されていないようです。これが私が試したコードです:

   var endpoint = Environment.GetEnvironmentVariable("MSI_ENDPOINT");
    string apiVersion = "2018-02-01";
    string resource = "https://management.azure.com/";
    string objectId = "<objectid>";
    string clientId = "<clientId>";

        // Build request to acquire managed identities for Azure resources token
        //HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
        //    "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/&object_id=4aef1720-b3b1-4935-8d68-e330508907fa&client_id=558ecc75-8697-4419-bab9-aa2c87043cfd");

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
       String.Format(
            "{0}?resource={1}&api-version={2}&object_id={3}&client_id={4}",
            endpoint,
            resource,
            apiVersion,
            objectId,
            clientId));

        req.Headers["Metadata"] = "true";
        req.Method = "GET";

        try
        {
            // Call /token endpoint
            HttpWebResponse response = (HttpWebResponse)req.GetResponse();

            // Pipe response Stream to a StreamReader, and extract access token
            StreamReader streamResponse = new StreamReader(response.GetResponseStream());
            string stringResponse = streamResponse.ReadToEnd();
            Dictionary<string, string> list =
                 JsonConvert.DeserializeObject<Dictionary<string, string>>(stringResponse);
            string accessToken = list["access_token"];

            System.IO.File.WriteAllText(@".\Log.txt", accessToken);
        }
        catch (Exception e)
        {
            string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");

            string log = "MSI_ENDPOINT : " + endpoint + "\n";
            log += ("ErrorText : " + errorText + "\n");
            System.IO.File.WriteAllText(@".\Log.txt", errorText);
            throw;
        }
4

1 に答える 1

5

まず、このリンクApp Service と Azure Functions のマネージド ID を使用する方法は、App Services の MSI に固有の適切なドキュメントを提供します。

質問で尋ねたように、特定のユーザーに割り当てられたマネージド サービス ID のトークンを取得する簡単なサンプル コードを次に示します。

  • resource - トークンを取得する必要があるリソースの AAD リソース URI。
  • apiversion - 使用するトークン API のバージョン。現在サポートされているバージョンは「2017-09-01」のみです。
  • clientId - 使用するユーザー割り当て ID の ID。省略した場合、システム割り当て ID が使用されます。

    public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion, string clientId)  
    {
        HttpClient client = new HttpClient();   
        client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
        return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}&clientid={3}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion,clientId));
    }
    

    全体として、上記のサンプル コードにはいくつかの変更点があります。

    1. 実行時に MSI_ENDPOINT を使用して URL を構築する
    2. パラメータは client_id ではなく clientid にする必要があります
    3. パラメータ object_id は不要です
    4. 上記のリンクのドキュメントによると、サポートされているのは 2017-09-01 だけです。
  • アプリ サービスの実行時に MSI_ENDPOINT 値が設定されないという問題については、Microsoft Docs の同じリンクからこのメモを参照してください。

    ここに画像の説明を入力

  • 使用されるすべてのパラメーターに関連するドキュメントのスクリーンショット

    ここに画像の説明を入力

于 2019-02-01T06:04:52.697 に答える