2015-12-16 1 views
5

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; 
    } 
+0

Sie müssen die Bezeichner zwischen eckigen Klammern durch tatsächliche Parameter aus Ihrer Bereitstellung ersetzen. – MvdD

+0

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. –

+0

Hallo @GraemeWilson, brauchst du noch eine Antwort dafür oder hast du die Lösung gefunden? – juvchan

Antwort

7

Ihr Problem etwas mit dem gültigen Publikum zu tun hat. Sie haben möglicherweise 2 Möglichkeiten:

Option 1. Versuchen Sie, das Token mit der WebAPI-Client-ID als AcquireToken-Methode 'Ressource' Parameter statt seiner Uri zu erwerben.

Option 2. Wenn die vorherige Methode nicht funktioniert hat, müssen Sie die Authentifizierungseinstellungen der App Service API mithilfe von Azure Resources Explorer ändern. Navigieren Sie zu Ihrer Web-API, suchen Sie das authSettings JSON-Dokument unter dem Knoten config, und ändern Sie (nach dem Wechsel in den Lese-/Schreibmodus) das Array allowedAudiences entsprechend Ihren Anforderungen. In Ihrem Fall müssen Sie möglicherweise http zu https

+0

Ich würde auch hinzufügen, dass, wenn Loul zu "Navigieren zu Ihrer Web-API" sagt, er meint, dass Sie das Suchfeld oben im Ressourcen-Explorer verwenden sollten. Wenn Sie beginnen, die Anbieter und Abonnements vor der Suche zu erweitern, scheint es nicht zu funktionieren. Letztlich fand ich meine API unter subscriptions/mysubname/resourceGroups/myresourcegroupname/providers/Microsoft.Web/sites –

0

ändern. In meiner ASP.NET 4.5 Web app fand ich, dass ich die gültigen Zielgruppen angeben musste, um zu vermeiden, dass eine Laufzeitausnahme ausgelöst wird.

public partial class Startup 
{ 
    private static string _aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 
    private static string _tenant = ConfigurationManager.AppSettings["ida:Tenant"]; 
    private static string _realm = ConfigurationManager.AppSettings["ida:Wtrealm"]; 
    private static string _metadataAddress = string.Format("{0}/{1}/federationmetadata/2007-06/federationmetadata.xml", _aadInstance, _tenant); 
    private static string _authority = String.Format(CultureInfo.InvariantCulture, _aadInstance, _tenant); 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     app.UseWsFederationAuthentication(
      new WsFederationAuthenticationOptions 
      { 
       Wtrealm = _realm, 
       MetadataAddress = _metadataAddress, 
       TokenValidationParameters = new TokenValidationParameters 
       { 
        ValidAudiences = new string[] { "spn:" + _realm } 
       } 
      } 
     ); 
    } 
} 
Verwandte Themen