Ich habe eine API-Anwendung, die mit einem Gateway-Host funktioniert hat und jetzt, da der Gateway-Host veraltet ist, versuche ich die Migration Guide zu folgen. Ich habe meinen Dienst mithilfe des SDK 2.8.1 erneut bereitgestellt und kann mich mit einem Browser, der AAD oder ein Microsoft-Konto verwendet, beim Dienst anmelden und Swagger zum Testen des Dienstes verwenden. Ich versuche jedoch, einen Client mit einer ClientId und Secret auf den Dienst zuzugreifen. Der Code kann das Zugriffstoken von AAD abrufen, aber ich erhalte immer einen Fehler 401, wenn ich versuche, auf eine der Serviceressourcen zuzugreifen.401 Fehler bei der Authentifizierung mit einer Azure API App mit AAD
Wenn ich debuggen den Dienst sehe ich die folgenden im Protokoll:
Microsoft.Azure.AppService.Authentication Verbose: 0 : Received request: GET https://[myService].azurewebsites.net/api/[myResource]
Microsoft.Azure.AppService.Authentication Warning: 0 : JWT validation failed: IDX10214: Audience validation failed. Audiences: 'https://[myService].azurewebsites.net/'. Did not match: validationParameters.ValidAudience: '[AAD ClientId]' or validationParameters.ValidAudiences: 'http://[myService].azurewebsites.net'.
Microsoft.Azure.AppService.Authentication Information: 0 : Sending response: 401.71 Unauthorized
The thread 0x3b00 has exited with code 0 (0x0).
Was die Frage zu sein scheint, ist, dass das Publikum mit dem Antrag vorgelegt https ist aber die validParameters.ValidAudiences Sammlung enthält nur http.
Ich kann die Zielgruppe nicht konfigurieren, und es scheint, dass die http-basierte Zielgruppe festgelegt wird, wenn Visual Studio 2015 den App-Dienst erstellt. Gibt es eine Möglichkeit, die ValidAudience-Sammlung manuell zu bearbeiten?
Als Referenz meines Client-Code ist:
private static void Main(string[] args)
{
string app_id_url = "https://[myService].azurewebsites.net/";
string authority = "https://login.windows.net/[myDirectory].onmicrosoft.com/";
string clientId = "[AAD ClientId]";
string clientSecret = "[AAD Client Secret]";
string apiBaseUrl = "https://[myService].azurewebsites.net/";
string aadToken = GetTokenForApplication(authority, clientId, clientSecret, app_id_url);
var apiClient = new HttpClient { BaseAddress = new Uri(apiBaseUrl) };
apiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", aadToken);
var apiResponse = apiClient.GetAsync(apiBaseUrl + @"api/[myResource]").Result;
string apiResponseContent = apiResponse.Content.ReadAsStringAsync().Result;
Console.WriteLine(apiResponseContent);
}
public static string GetTokenForApplication(string authority, string clientId, string clientSecret, string resourceUrl)
{
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);
AuthenticationResult authenticationResult = authenticationContext.AcquireToken(resourceUrl, clientCred);
string token = authenticationResult.AccessToken;
return token;
}
Sie müssen die Bezeichner zwischen eckigen Klammern durch tatsächliche Parameter aus Ihrer Bereitstellung ersetzen. – MvdD
Danke @MvdD, aber ich habe die tatsächlichen Parameter für die Zwecke dieses Beitrags herausgenommen. Wie Sie oben auf dem Post sehen können, funktionierte das jetzt und nicht mehr. –
Hallo @GraemeWilson, brauchst du noch eine Antwort dafür oder hast du die Lösung gefunden? – juvchan