2017-10-01 2 views
2

J'ai une petite application existante que j'utilise pour le test, il est dans Asp.Net Core 1.1 pour l'application Web et l'API, l'authentification est fait en utilisant Azure AD B2C. J'essaie de le déplacer vers .Net Core 2.0 mais je n'arrive pas à comprendre comment le faire fonctionner, j'ai essayé d'utiliser à la fois l'échantillon de GitHub Azure-Samples pour Web App et API, mais j'ai une erreur non autorisée ou 500 quand essayer d'accéder à l'API, si vous avez un exemple de travail pour appeler une API web à partir d'une application web en utilisant 2.0 et protégé par AD B2C, il sera grandement apprécié.Asp.Net Core 2.0 et Azure AD B2C pour l'authentification sur WebApp et API

Edit: L'exemple que j'utilise pour tester: Web App: WebApp-OpenIDConnect-DotNet core2.0 Web Api: B2C-WebApi core2.0 , j'ai changé les valeurs appSettings pour correspondre à mon répertoire b2c.

Pour mon application de test asp.net core 1.1, j'utilise les mêmes exemples que ci-dessus mais de la branche master, avec la même valeur pour appsettings.

Edit 2 par défaut, dans startup.cs je ceci:

 services.AddAuthentication() 
      .AddJwtBearer(option => new JwtBearerOptions 
      { 
       Authority = string.Format("https://login.microsoftonline.com/tfp/{0}/{1}/v2.0/", 
       Configuration["Authentication:AzureAd:Tenant"], Configuration["Authentication:AzureAd:Policy"]), 
       Audience = Configuration["Authentication:AzureAd:ClientId"], 
       Events = new JwtBearerEvents 
       { 
        OnAuthenticationFailed = AuthenticationFailed 
       } 
      }); 

qui me donne l'erreur suivante:

Microsoft.AspNetCore.Hosting.Internal.WebHost: Information: Demande de démarrage HTTP/1.1 GET http://localhost:44352/api/values/5
Microsoft.AspNetCore.Server.Kestrel: Erreur: ID de connexion "0HL89JHF4VBLM", ID de demande "0HL89JHF4VBLM: 00000001": Une exception non gérée a été levée par l'application. System.InvalidOperationException: Aucun authenticationScheme n'a été spécifié et aucun DefaultChallengeScheme n'a été trouvé.

si services.AddAuthentication modifié comme

 services.AddAuthentication(sharedOption => 
     { 
      sharedOption.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
     }) 

l'erreur est maintenant

Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Information: Impossible de valider le xxx jeton. Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10500: Échec de la validation de la signature. Aucune clé de sécurité n'a été fournie pour valider la signature. à System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (jeton de chaîne, TokenValidationParameters validationParameters) à System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (jeton String, TokenValidationParameters validationParameters, SecurityToken & validatedToken) à Microsoft.AspNetCore. Authentication.JwtBearer.JwtBearerHandler.d__6.MoveNext()

+0

Cela ne suffit pas informations pour vous aider. Pouvez-vous ajouter des liens aux échantillons que vous utilisez, au code que vous utilisez, aux requêtes http et aux charges utiles de jetons? – Saca

+0

@Saca, j'ai édité la question pour ajouter les liens et plus d'information, excepté les appsettings que j'ai faits ou fais aucun changement –

+0

Cela fonctionne si App et Api sont avec le noyau de .net 1.1 ou si App est 2.0 et Api est 1.1. Cela ne fonctionne pas si App et Api sont 2.0 ou si App est 1.1 et Api est 2.0 –

Répondre

0

J'ai vu une demande de traction sur l'échantillon qui corrige ce problème (Link), le services.AddAuthentication doit être modification:

 services.AddAuthentication(options => 
      { 
      options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
          }) 
      .AddJwtBearer(jwtOptions => 
      { 
      jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["Authentication:AzureAd:Tenant"]}/{Configuration["Authentication:AzureAd:Policy"]}/v2.0/"; 
      jwtOptions.Audience = Configuration["Authentication:AzureAd:ClientId"]; 
      jwtOptions.Events = new JwtBearerEvents 
           { 
       OnAuthenticationFailed = AuthenticationFailed 
            }; 
      }); 
0

Je suis arrivé ce exemple fonctionnant à la fois pour Core 1.1 et Core 2.0, s'il vous plaît ajouter l'authentification de serment comme ci-dessous,

services.AddAuthentication(sharedOptions => 
      { 
       sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
       sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 
      }) 
      .AddAzureAdB2C(options => Configuration.Bind("Authentication:AzureAdB2C", options)) 

Les options de configuration seront définies à l'intérieur de la classe « AzureAdB2CAuthenticationBuilderExtensions », qui se trouve à l'intérieur de la azure b2c project

On dirait que votre jeton est de ne pas le mettre à jour à partir d'Azure, êtes-vous en mesure d'obtenir le jeton depuis votre application Web? Pourriez-vous vérifier que vous n'obtenez pas la valeur null?

Avez-vous enregistré vos étendues d'API sur votre application web locataire azure b2c? « ApiScopes »: « https://fabrikamb2c.onmicrosoft.com/demoapi/demo.read »

vous devez définir la portée dans votre api web et permet de lire sur l'application Web, s'il vous plaît suivre cliquez sur le link afin de le mettre en place