0

Je travaille actuellement sur un projet où j'ai une API Web qui utilise l'API Graph pour créer des comptes dans mon Azure AD et les mettre dans le bon groupe.Impossible d'authentifier l'API web avec Bearer Token

À côté de cela, j'ai plusieurs appels d'API exposés qui seront appelés par une application iOS native ainsi qu'une application web angularJS. Le client a concocté une façon étrange de faire l'authentification parce qu'il croit fermement que ses utilisateurs sont des crétins.

Le client remet des appareils iOS préprogrammés personnalisés à certaines personnes. L'appareil dispose d'un utilisateur Azure AD (principal) et d'un mot de passe. Une fois qu'ils sont distribués, un processus sur l'application Web de AngularJS fait cela, l'application va alors appeler mon contrôleur jeton qui ressemble à ceci:

public async Task<string> GetTokenForUserAsync(string userPrincipalName, string password) 
    { 
     var uri = string.Format("{0}/oauth2/token", AuthString); 
     using (var httpClient = new HttpClient 
     { 
      DefaultRequestHeaders = { Accept = { new MediaTypeWithQualityHeaderValue("application/json") } } 
     }) 
     { 
      var values = new Dictionary<string, string> 
      { 
       {"resource", GraphUrl }, 
       {"client_id", ClientId }, 
       {"client_secret", ClientSecret }, 
       {"grant_type", "password" }, 
       {"username", userPrincipalName }, 
       {"password", password }, 
       {"scope", "openid" } 
      }; 

      var content = new FormUrlEncodedContent(values); 
      var response = await httpClient.PostAsync(uri, content); 

      var responseContent = await response.Content.ReadAsStringAsync(); 

      return responseContent; 
     } 

Les paramètres passés sont pas 100% exact, mais très semblables:

Cet appel me fournit donc un access_token. Le problème que j'ai est que les jetons que je reçois ne sont jamais autorisés. J'ai essayé plusieurs configurations de démarrage, mais aucune ne fonctionne.

Actuellement, j'ai le code suivant dans mes Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions 
     { 
      TokenValidationParameters = new TokenValidationParameters 
      { 
       ValidAudience = ConfigurationManager.AppSettings["ida:ClientId"] 
      } 

     }); 
     //app.UseWindowsAzureActiveDirectoryBearerAuthentication(
     // new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
     // { 
     //  TokenValidationParameters = new TokenValidationParameters 
     //  { 
     //   ValidAudience = ConfigurationManager.AppSettings["ida:ClientId"] 
     //  }, 
     //  Tenant = ConfigurationManager.AppSettings["ida:Tenant"], 
     // }); 
    } 

Il est la première fois que je travaille avec Azure et Active Directory. Donc je suis probablement en train de faire quelque chose de vraiment stupide. En ce moment, je me fiche du style et de la «bonne manière». Je veux juste que cette chose fonctionne:,/

Espérons que j'ai décrit mon problème correctement et documenté ma question en conséquence. Si vous avez des questions, n'hésitez pas à demander!

Merci un groupe à l'avance

Répondre

0

Je ne pense pas que vous pouvez obtenir accesstoken des valeurs var = new Dictionnaire { { "ressource", GraphUrl}, { "client_id", ClientId}, { "client_secret », ClientSecret}, { "grant_type", "mot de passe"}, { "nom d'utilisateur", userPrincipalName}, { "mot de passe", mot de passe}, { "champ", "openid"}} ; afin que vous puissiez essayer d'autres méthodes:

 AuthenticationContext aContext = 
       new AuthenticationContext("https://login.microsoftonline.com/tenantid"); 
      AuthenticationResult aResult = 
       aContext.AcquireToken("https://graph.windows.net", 
           "1950a258-227b-4e31-a9cf-717495945fc2", 
           new UserCredential(UserId, PasswordId)); 

      string result = string.Empty; 
      HttpClient httpClient = new HttpClient(); 
      httpClient.DefaultRequestHeaders.Authorization = 
       new AuthenticationHeaderValue("Bearer", aResult.AccessToken); 
      HttpResponseMessage response = 
       httpClient.GetAsync("https://graph.windows.net/tenantid/users/userid?api-version=1.6").Result; 

      if (response.IsSuccessStatusCode) 
      { 
       result = response.Content.ReadAsStringAsync().Result; 
      } 
      Console.WriteLine(result); 
      Console.ReadLine();