2016-11-08 4 views
3

ADAL v3 hat die UserPasswordCredential-Klasse, aber ich kann keine funktionierende Implementierung finden. Es gibt keine AcquireToken-Überladung, die einen UserPasswordCredential- oder UserCredential-Typ akzeptiert. Was ist die korrekte Art, den Benutzernamen & Passwortfluss in ADAL v3 auszuführen? Dieses spezielle Stück Code verwendet volles .Net 4.5.ADAL v3: Wie authentifiziere ich mich mit UserPasswordCredential?

Antwort

3

Wenn Sie mit Client-Anwendung zu entwickeln wurden, können Sie den Code beziehen sich unter den Token zu erwerben:

string authority = "https://login.microsoftonline.com/xxxx.onmicrosoft.com"; 
string resrouce = "https://graph.windows.net"; 
string clientId = ""; 
string userName = ""; 
string password = ""; 
UserPasswordCredential userPasswordCredential = new UserPasswordCredential(userName,password); 
AuthenticationContext authContext = new AuthenticationContext(authority); 
var token= authContext.AcquireTokenAsync(resrouce,clientId, userPasswordCredential).Result.AccessToken; 

Und wenn Sie mit Web-App zu entwickeln wurden (dies ist kein gängiges Szenario), gibt es keine solche Methode in ADAL V3, um dieses Szenario zu unterstützen. Als Workaround können Sie die Anfrage selbst erstellen. Hier ist ein Beispiel für Ihre Referenz:

POST: https://login.microsoftonline.com/xxxxx.onmicrosoft.com/oauth2/token 

Content-Type: application/x-www-form-urlencoded 
resource={resource}&client_id={clientId}&grant_type=password&username={userName}&password={password}&scope=openid&client_secret={clientSecret} 
+2

Danke. Die neue Dokumentations-Site auf docs.microsoft.com ist unglaublich schwer zu lesen, was adal v3 unnötig schwer macht, imho. – Trondh

+0

Wo verwenden wir in diesem Fall das Client-Geheimnis? Ich denke, wir brauchen es. – Kurkula

+2

@Trondh DITTO, ich bin so müde, SO viel Zeit damit zu verschwenden, diesen Mist zu jagen – Mikee

2

auf dem zweiten Teil der akzeptierte Antwort zu erarbeiten, hier ist eine Implementierung der POST-Anforderung zu machen:

From SettingHelper: public static string GetAuthorityEndpoint(string azuretenantId) => $"https://login.microsoftonline.com/{azuretenantId}/"; 

    private static async Task<OAuthResult> AuthenticateAsync(string resource = "https://yourAzureADProtectedResource.url/") 
    { 
     var oauthEndpoint = new Uri(new Uri(SettingsHelper.GetAuthorityEndpoint("your AAD Tenent ID")), "oauth2/token"); 

     using (var client = new HttpClient()) 
     { 
      var result = await client.PostAsync(oauthEndpoint, new FormUrlEncodedContent(new[] 
      { 
       new KeyValuePair<string, string>("resource", resource), 
       new KeyValuePair<string, string>("client_id", "your AAD App Id"), 
       new KeyValuePair<string, string>("grant_type", "password"), 
       new KeyValuePair<string, string>("username", "[email protected]"), 
       new KeyValuePair<string, string>("password", "your password"), 
       new KeyValuePair<string, string>("scope", "openid"), 
       new KeyValuePair<string, string>("client_secret", "an access key for your AAD App"), 
      })); 

      var content = await result.Content.ReadAsStringAsync(); 
      var authResult = JsonConvert.DeserializeObject<OAuthResult>(content); 
      return authResult; 
     } 
    } 

    class OAuthResult 
    { 
     public string Token_Type { get; set; } 
     public string Scope { get; set; } 
     public int Expires_In { get; set; } 
     public int Ext_Expires_In { get; set; } 
     public int Expires_On { get; set; } 
     public int Not_Before { get; set; } 
     public Uri Resource { get; set; } 
     public string Access_Token { get; set; } 
    } 

Sie können dann mit gehen zu das Auth Ergebnis wie folgt:

private async Task<HttpClient> GetHttpClientWithAzureADAuthentication() 
    { 
     OAuthResult authResult; 
     try 
     { 
      authResult = await AuthenticateAsync(); 
      var httpClient = GetHttpClient(); 
      httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {authResult.Access_Token}"); 

      return httpClient; 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine(e); 
      throw; 
     } 
    } 
+0

Offensichtlich würden Sie keine Dinge hart programmieren Hier sind sie hier, um die Lösung zu veranschaulichen :) –

Verwandte Themen