2017-03-16 95 views
0

我試圖從Azure AD系統檢索身份驗證令牌。我已經嘗試了許多不同的配置async方法以及await命令的方法,但每次出現錯誤「任務被取消」。來自Web應用的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; 
} 

編輯... 我更新的代碼:

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命令拋出AdalException的內部消息「任務被取消」 –

回答

0

根據您的描述,我已通過在.NET Framework 4.5上創建我的Web窗體應用程序目標並引用Active Directory Authentication Library 3.13.8來測試此問題。根據您的代碼,它可以像我預期的那樣工作並部署到Azure Web App。這是我的git sample,你可以參考它並試圖找出它是否可以按預期工作。

+0

謝謝你。一旦我部署到Azure Web應用程序開始工作,但是,本地相同的代碼不會給我的令牌。 –

0

async void方法ASP.NET是不是一件好事。有關它的一些信息,請參閱https://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx

我相信你Login_Click方法應使用此行來調用Authorize異步:

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

然後Login_Click應該原封不動地返回void沒有async關鍵字。

+0

可悲的是我沒有更進一步。我已經改變了我的代碼,但是,這並沒有讓我更進一步。我仍然收到與之前提到的「任務已取消」相同的消息。已編輯問題中的更新代碼。 –

相關問題