web-dev-qa-db-fra.com

Azure AD Authentification 401 Erreur "Le public est invalide" API BEAU WEB .NET .NET CORE

J'essaie de créer un exemple simple d'authentification AV sur Azure tilisation de cet exemple Sauf que mon client est JQuery. Je ne sais pas pourquoi je reçois l'erreur 401 sur le public est invalide lorsque le jeton affiche le public est https://myportal.onmicrosoft.com/test_core_web_api_spa. Cela correspond à la définition de l'API à Azure. La seule pièce manquante est la portée personnalisée de user_impersonation Mais lorsque je fais l'appel en utilisant msal clientApplication.acquireTokenSilent(tokenRequest2) Pour acquérir le jeton, mes étanches correspondent à l'URL complète de l'API avec portée:

const tokenRequest2 = {
    scopes: ["https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation"]
};

Dans l'API pour établir une authentification, j'utilise ce code (j'ai remarqué pas de nombreux exemples d'utilisation de cette méthode)

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
   .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

Et la configuration de l'API est

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "myportal.onmicrosoft.com",
    "TenantId": "my-tenant-guid",
    "ClientId": "my-api-client-guid"
  },

J'ai remarqué de nombreux exemples montrant un format différent de l'API (je suppose que celles-ci sont une version plus ancienne), mais la portée de l'API exposée est répertoriée à Azure comme https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation. J'ai également ajouté le GUID du client à l'aide du tableau de bord Azure pour accéder à cette portée API exposée.

Des idées où j'ai mal tourné? Alternativement, tous les exemples simples utilisant MSAL, JQuery pour le client et une simple API WEB .NET CORE? On dirait que tous les exemples que je trouve sont obsolètes ou utilisez un client différent ou une méthode d'authentification différente.

Mise à jour pour afficher les paramètres d'API exposent dans Azure pour l'application API Web J'ai ajouté une image de Azure montrant les paramètres de l'écran "Exposer un API" . J'ai ajouté la portée personnalisée user_impersonation Puis a ajouté le client et l'a accordé l'accès à cette portée. Comme vous pouvez le voir, mon abonnement Azure n'a pas le format api://guid Vu par d'autres. Lorsque j'essaie d'utiliser ce format api://guid I Obtenir l'erreur The resource principal named api://guid was not found in the tenant.

J'ai aussi ajouté une image du jeton. La balise aud correspond à mon nom d'application Web API à Azure. Et le scp énumère la portée que j'ai jointe à la demande de ma scope. Je ne peux tout simplement pas voir quoi d'autre à essayer.

enter image description here

expose api settings for web api

9
pretzelb

Le problème était les données de configuration de l'API Web. Quand ils disent que le ClientId ce qu'ils veulent vraiment, c'est la valeur dans l'option "Expose une API" où elle indique "Uri de l'application Uri". Ce que je faisais, il y avait le GUID pour l'enregistrement d'applications de l'API Web. Vous trouverez ci-dessous comment il devrait regarder.

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "myportal.onmicrosoft.com",
    "TenantId": "mytenant-guid",
    "ClientId": "https://myportal.onmicrosoft.com/test_core_web_api_spa"
  },

Remarque sur le format API. Il semble que lorsque vous enregistrez l'application directement dans Azure, le format de l'API exposé sera api://app-guid. Mais si vous créez d'abord votre application à l'aide de Visual Studio, le format sera par défaut à quelque chose comme https:///myportal.onmicrosoft.com/project-name-in-visual-studio.

4
pretzelb

La portée n'est pas correcte, c'est pourquoi vous avez eu the audience is invalid.

La portée devrait être quelque chose comme api://web_api_clientId/read.

enter image description here

0
Tony Ju