2017-03-16 11 views
0

Azure ADシステムから認証トークンを取得しようとしています。私はawaitコマンドと一緒に非同期メソッドを設定するさまざまな方法を試しましたが、 "タスクがキャンセルされました"というエラーが出るたびに試しました。Web AppのAzure非同期認証トークン

aspxページでasync = "true"を取得しました。

トークンを正常に取得して取得するために、私が別のやり方で行う必要があるアイディア。

同じコードがコンソールアプリケーションで動作するため、問題は非同期操作の処理方法と関係していると考えています。次のように

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

protected async void Login_click(object sender, EventArgs e) 
{ 
    response1.Text = "Started"; 
    var tentantID = ConfigurationManager.AppSettings["tenantID"]; 
    var clientId = ConfigurationManager.AppSettings["applicationID"]; 
    var secret = ConfigurationManager.AppSettings["secret"]; 

    await Authorize(tentantID , clientId, secret); 
} 
private async Task<AuthenticationResult> GetToken(string clientId, string tenantDomain, string clientSecret) 
{ 
    AuthenticationResult result = null; 

    var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantDomain); 

    try 
    { 
     ClientCredential clientCredential = new ClientCredential(clientId, clientSecret); 
     return result = await context.AcquireTokenAsync("https://management.core.windows.net/", clientCredential).ConfigureAwait(false); 

    } 
    catch (AdalException ae) 
    { 
     //Error code 
     return null; 
    } 
    catch (Exception e) 
    { 
     //Error code 
     return null; 
    } 
} 

private async Task Authorize(string tenant, string clientId, string clientSecret) 
{ 
    var authenticationResult = await GetToken(clientId, tenant, clientSecret).ConfigureAwait(false); 

    string token = authenticationResult.AccessToken; 
} 

EDIT ... 私の更新されたコード:ASP.NETでの

protected void Login_click(object sender, EventArgs e) 
{ 
    response1.Text = "Started"; 

    RegisterAsyncTask(new PageAsyncTask(Authorize)); 
} 
public async Task Authorize() 
{ 

    var tentantID = ConfigurationManager.AppSettings["tenantID"]; 
    var clientId = ConfigurationManager.AppSettings["applicationID"]; 
    string myKey = ConfigurationManager.AppSettings["myKey"]; 
    var tenantDomain = ConfigurationManager.AppSettings["tenantDomain"]; 

    var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantDomain, false); 

    try 
    { 
     ClientCredential clientCredential = new ClientCredential(clientId, myKey); 
     var result = context.AcquireTokenAsync("https://management.core.windows.net/", clientCredential).ConfigureAwait(false); 

     AuthenticationResult resVal = await result; 
     token = resVal.AccessToken; 
    } 
    catch (AdalException ae) 
    { 
     //error code 
     token = ae.InnerException.Message; 
    } 
} 
+0

どの行でエラーが表示されますか? 'GetToken()'の中でデバッグすると、* catch *ブロックのどれかを入力しますか? – Alisson

+0

AcquireTokenAsyncコマンドは、内部メッセージ「A Task was cancelled」でAdalExceptionをスローします。 –

答えて

0

説明によると、.NET Framework 4.5でWebフォームアプリケーションターゲットを作成し、Active Directory Authentication Library 3.13.8を参照してこの問題をテストしました。あなたのコードに基づいて、私の側では期待どおりに動作し、Azure Web Appにデプロイできます。ここに私のgit sampleがあります。それを参照して、それが期待どおりに機能するかどうかを調べることができます。

+0

ありがとう。私がAzure Web Appにデプロイすると、それは動作し始めましたが、同じコードがローカルには私にトークンを与えませんでした。 –

0

async void方法は良いことではありません。それに関する情報については、https://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspxを参照してください。

私はあなたのLogin_Clickメソッドが非同期にAuthorizeを呼び出すために、このラインを使用する必要があります信じる:

RegisterAsyncTask(new PageAsyncTask(Authorize(tentantID, clientId, secret))); 

そしてLogin_Clickはちょうどasyncキーワードなしvoidを返す必要があります。

+0

悲しいことに私はそれ以上のことはありません。私は提案したように私のコードを変更しましたが、これ以上私を得ていません。私はまだ "タスクがキャンセルされました"と言われる前と同じメッセージを受け取りました編集された質問の更新されたコード。 –

関連する問題