2017-03-16 4 views
0

Ich versuche, ein Authentifizierungstoken vom Azure AD-System abzurufen. Ich habe eine Reihe von verschiedenen Möglichkeiten der Konfiguration der async-Methode zusammen mit dem Befehl warten versucht, aber jedes Mal, wenn ich den Fehler bekomme "Eine Aufgabe wurde abgebrochen".Azure Async-Authentifizierungstoken aus Web App

Ich habe async = "true" in meiner aspx-Seite.

Irgendwelche Ideen, was ich anders machen muss, um eine erfolgreiche Anfrage zu erhalten und das Token abzurufen.

Derselbe Code funktioniert in einer Konsolenanwendung, daher gehe ich davon aus, dass das Problem etwas mit der Art zu tun hat, wie die asynchronen Vorgänge ablaufen.

Mein Code ist wie folgt:

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 ... Meine aktualisierten Code:

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

Welche Zeile gibt Ihnen den Fehler? Wenn Sie innerhalb 'GetToken()' debuggen, geben Sie irgendeinen dieser * catch * Blöcke ein? – Alisson

+0

Der AcquireTokenAsync-Befehl löst die AdalException mit der inneren Nachricht aus "Eine Aufgabe wurde abgebrochen" –

Antwort

0

Gemäß Ihrer Beschreibung habe ich dieses Problem getestet, indem ich mein Web Form-Anwendungsziel in .NET Framework 4.5 erstellt und auf Active Directory Authentication Library 3.13.8 verweist. Basierend auf Ihrem Code könnte er auf meiner Seite wie erwartet funktionieren und in Azure Web App bereitgestellt werden. Hier ist meine git sample, Sie könnten darauf verweisen und versuchen herauszufinden, ob es wie erwartet funktionieren könnte.

+0

Danke dafür. Sobald ich es in einer Azure Web App bereitgestellt hatte, funktionierte es zwar, aber derselbe Code gab mir nicht das Token. –

0

async void Methoden in ASP.NET ist nicht eine gute Sache. Für weitere Informationen siehe https://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx.

Ich glaube, Ihr Login_Click Methode, um diese Zeile Authorize aufrufen asynchron verwenden sollten:

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

Und dann Login_Click sollte nur void ohne async Schlüsselwort zurückzukehren.

+0

Leider bin ich nicht weiter dabei. Ich habe meinen Code wie vorgeschlagen geändert, aber das hat mich nicht weiter gebracht. Ich bekomme immer noch die gleiche Nachricht wie zuvor erwähnt "Eine Aufgabe wurde abgebrochen" Aktualisierter Code in der bearbeiteten Frage. –