0

Ich arbeite gerade an einem Projekt mit einer Web-API, die die Graph-API verwendet, um Konten in meinem Azure AD zu erstellen und sie ebenfalls in die richtige Gruppe aufzunehmen.Web-API kann nicht mit Bearer-Token authentifiziert werden

Daneben habe ich mehrere API-Aufrufe veröffentlicht, die von einer nativen iOS App sowie einer angularJS Web App aufgerufen werden. Der Client hat eine seltsame Art und Weise der Authentifizierung erfunden, weil er fest davon überzeugt ist, dass seine Benutzer absolute Idioten sind.

Der Client übergibt bestimmte vorbereitete iOS-Geräte an bestimmte Personen. Das Gerät verfügt über einen Azure AD-Benutzer (Prinzipal) und ein Kennwort. Sobald sie ausgehändigt werden, auf einige Verfahren der AngularJS Web-App dies der Fall ist, wird die App dann mein Token-Controller aufrufen, die wie folgt aussieht:

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

Die übergebenen Parameter sind nicht 100% genau, aber sehr ähnlich:

Also dieser Aufruf liefert mir tatsächlich ein access_token. Das Problem, das ich habe, ist, dass die Tokens, die ich bekomme, niemals autorisiert sind. Ich habe mehrere Startup-Setups ausprobiert, aber keines funktioniert.

Zur Zeit habe ich den folgenden Code in meinem Startup.Auth.cs bekam

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"], 
     // }); 
    } 

Es ist das erste Mal, dass ich mit Azure und Active Directory arbeite. Also mache ich wahrscheinlich etwas wirklich Dummes. In diesem Moment ist mir das Styling und der "richtige Weg" egal. Ich will nur, dass diese Sache funktioniert:,/

Ich hoffe, ich habe mein Problem richtig beschrieben und meine Frage entsprechend dokumentiert. Wenn Sie irgendwelche Fragen haben, zögern Sie bitte nicht zu fragen!

Dank einem Haufen im Voraus

Antwort

0

Ich denke nicht, Sie von var Werte = new Wörterbuch { accesstoken erhalten kann { "Ressource", GraphUrl}, { "client_id", ClientId}, { "client_secret “ClientSecret}, { "grant_type", "Passwort"}, { "username", userprincipal}, { "password", Passwort}, { "scope", "OpenID"} }; so können Sie andere Methoden ausprobieren:

 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();