2017-10-04 3 views
0

2つのAzure Function Appsを作成しました。どちらも認証/認可で設定されているため、両方のADアプリケーションが作成されました。私は1つの機能から他のMSIを使用してAD Authを設定したいと思います。私は、ARMテンプレートを使用してマネージドサービスIDを使用してクライアント機能をセットアップしました。私はアクセストークンを取得するための簡単なテスト関数を作成し、それを返します:Microsoft.Azure.Services.AppAuthentication:トークン応答が期待どおりの形式ではありません。MSIで機能するAzure機能がサポートされています

try { 
    var azureServiceTokenProvider = new AzureServiceTokenProvider(); 
    string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://myapp-registration-westus-dev.azurewebsites.net/"); 
    log.Info($"Access Token: {accessToken}"); 
    return req.CreateResponse(new {token = accessToken}); 
} 
catch(Exception ex) { 
    log.Error("Error", ex); 
    throw; 
} 

答えて

0

はい、これを行う方法があります。私は高レベルで説明し、MSIドキュメンテーションバックログに項目を追加して、適切なチュートリアルを作成します。

あなたがしたいことは、このAzure AD認証サンプルに従いますが、TodoListServiceの部分:https://github.com/Azure-Samples/active-directory-dotnet-daemonの設定と実装のみを行います。

TodoListDaemonの役割は、代わりにManaged Service Identityによって再生されます。したがって、Readmeの指示どおりにAzure ADにTodoListDaemonアプリケーションを登録する必要はありません。 VM/Appサービス/機能でMSIを有効にするだけです。あなたのコードのクライアント側のコードで

、あなたはMSI(VM上または機能やアプリケーションサービス中)への呼び出しを行う際に、リソースパラメータとしてTodoListServiceのAppIDのURIを供給しています。 MSIはあなたのためのその聴衆のためのトークンをフェッチします。

TodoListServiceのコードの例では、トークンを受け取ったときにそのトークンを検証する方法を示します。

本質的に、あなたがしたいのは、Azure ADにAppを登録し、それにAppID URIを与え、そのAppID URIをMSIへの呼び出し時にリソースパラメータとして使用することです。次に、サービス/受信側で受け取ったトークンを検証します。

0

"https://myapp-registration-westus-dev.azurewebsites.net/" 使用リソースIDが正確であることを確認してください。私はここでAzure AD認証を設定するための手順を踏んで、同じコードを使用してトークンを取得できました。 https://docs.microsoft.com/en-us/azure/app-service/app-service-mobile-how-to-configure-active-directory-authentication

このコードを実行して、MSIから返されたエラーを正確に確認することもできます。問題の解決に役立たない場合は、エラーを投稿してください。

HttpClient client = new HttpClient(); 
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET")); 
var response = await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), "https://myapp-registration-westus-dev.azurewebsites.net/", "2017-09-01")); 
string msiResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
log.Info($"MSI Response: {msiResponse}"); 

アップデート: - 私のために このproject.jsonファイルとrun.csxファイル作品。注:project.jsonは.NET 4.6を指し、Azure関数のドキュメント(コメント内のリンク)に従って、.NET 4.6は現在サポートされている唯一のバージョンです。 参照アセンブリを再度アップロードする必要はありません。おそらく、net452の代わりにnetstandardアセンブリの誤った手動アップロードが問題を引き起こしています。

のみの.NET Framework 4.6がサポートされ、ので、ここで示したように、あなたの project.jsonファイルがnet46指定していることを確認しています。 project.jsonファイルをアップロードすると、ランタイムはパッケージを取得し、自動的に がパッケージアセンブリへの参照を追加します。 #r "AssemblyName"ディレクティブを追加する必要はありません。 NuGet パッケージで定義されたタイプを使用するには、必要なusingステートメントをrun.csxファイルに追加します。

project.json

{ 
    "frameworks": { 
    "net46":{ 
     "dependencies": { 
     "Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview" 
     } 
    } 
    } 
} 

run.csx

using Microsoft.Azure.Services.AppAuthentication; 

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    try 
    { 
     var azureServiceTokenProvider = new AzureServiceTokenProvider(); 
     string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net/"); 
     log.Info($"Access Token: {accessToken}"); 
     return req.CreateResponse(new {token = accessToken}); 
    } 
    catch(Exception ex) 
    { 
     log.Error("Error", ex); 
     throw; 
    }  
} 
+0

"Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview"、 –

+0

同じリソースuriでclient.GetAsync()を使用すると、有効なトークンが返されます。 Azure関数では、NuGetを使ってAppAuthenticationコンポーネントを解決し、#r ".. \ bin \ ..."で参照しています。私はこのリファレンスを使用しています:** "Microsoft.Azure.Services.AppAuthentication": "1.0.0プレビュー" **これは最新バージョンですか?また、関数を後で呼び出すとGetAccesstokenAsync()がハングし、返されません。 –

+0

あなたはclient.GetAsync()から取得した応答を共有できますか?「MSI応答」はログに記録されますか?アクセストークンをプレースホルダ(たとえば「eyJ0eXAi ...」)で置き換えます。応答形式が期待どおりであることを確認したいだけです。 NuGetのバージョンは正しいですが、これが唯一のバージョンです。 –

関連する問題