2017-01-11 2 views
4

Ich teste out IdentityServer4, durch die Dokumentation gehen, um mehr über OAuth2, OpenId Connect und Claim-basierte Authentifizierung, von denen alle ich neu bin. Allerdings verhalten sich einige der Beispielcode seltsam und ich kann nicht herausfinden, warum ...Ich kann nicht auf UserInfo Endpunkt in IdentityServer4 Dokument Beispiel von Client

So von meinem Verständnis, wenn die Erlaubnis erteilt, auf Benutzerdaten zugreifen, kann der Client auf den UserInfo Endpunkt, der Daten enthält wie Forderungen usw.

In IdentityServer4 gibt es sogar eine Einstellung

GetClaimsFromUserInfoEndpoint 

, dass die Dokumentation empfiehlt wir auf true gesetzt.

Also ich folgen die Startup-Guides von IdentityServer4 und alles funktioniert perfekt bis zu einem Punkt. This Quickstart enthält den mitgelieferten Beispielcode, obwohl ich davon ausgehe, dass mir etwas offensichtlich fehlt und der Code nicht benötigt wird.

Basierend auf der OpenID-Konfigurationsseite des laufenden Servers wird der Endpunkt in Userinfo http://localhost:5000/connect/userinfo befindet und wenn ich versuche es über den Browser zugreifen ich eine Navigationsleiste zu sehen bin, die ich angemeldet bin behauptet, aber der Körper der Seite ist eine Eingabeaufforderung. Sieht seltsam aus, aber ich nehme an, dass dies daran liegt, dass ich bei localhost: 5000 (IdentityServer4) angemeldet bin, aber ich sende nicht das userId-Token, das ich für den Client auf localhost: 5002 bekommen habe.

Also schrieb ich den folgenden Code auf meiner Client-Anwendung:

public async Task<IActionResult> GetData() 
    { 
     var accessToken = HttpContext.Authentication.GetTokenAsync("access_token").Result; 
     HttpClient client = new HttpClient(); 
     client.SetBearerToken(accessToken); 

     var userInfo = await client.GetStringAsync("http://localhost:5000/connect/userinfo"); 

     return Content(userInfo); 
    } 

Hier weiß ich, dass GetTokenAsync („access_token“) funktionieren soll, wie es in anderen Orten im Beispielprojekt von der Client-Anwendung verwendet wird, die verbinden zu einer API. Die Antwort, die ich bekomme, ist jedoch wieder die Layout-Seite von IdentityServer und eine Login-Eingabeaufforderung.

Haben Sie eine Idee, was mein Fehler ist und wie Sie auf den UserInfo-Endpunkt zugreifen können?

Edit: entfernt Thread-blocking, so dass ich Fremden beschämend Testcode nicht

Ok zeigen, so stellt sich heraus, dass dieser Code eine vereinfachte Version haben sollte, nämlich:

 UserInfoClient uic = new UserInfoClient("http://localhost:5000", idToken); 
     var result = await uic.GetAsync(); 


     return Content(JsonConvert.SerializeObject(result.Claims)); 

Noch , das Problem bleibt bestehen, selbst der gekapselte Code in UserInfoClient trifft die Mauer von "keine Benutzerendpunktdaten, nur das Layout für die Beispielwebsite".

+1

Ok, ich habe heute das gleiche Problem konfrontiert. Und in meinem Fall war das access_token falsch. Ich habe ein gültiges Token mit der Ausführung von HttpContext.Authentication.GetAuthenticateInfoAsync ("oidc"). – valverde93

+0

Ok, ich habe Versionskontrolle, also weiß ich, dass ich buchstäblich nichts geändert habe, aber jetzt funktioniert es.Ich habe den Fluss von HybridWithClientCredentials zu Hybrid geändert, aber selbst wenn ich es zurück an HybridWithClientCredentials zurücksende, funktioniert GetStringAsync wie es sollte. Inzwischen hat der UserInfoClient diesen Fehler. Ich bin sehr verwirrt ... – nikovn

Antwort

0

Es ist wahrscheinlich etwas zu spät zu beantworten, aber für alle, die noch auf das Stolpern, versuchen Sie dies ---

var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token"); 

var client = new HttpClient(); 

client.SetBearerToken(accessToken); 

var userInfoClient = new UserInfoClient("http://localhost:5000/connect/userinfo"); 

var response = await userInfoClient.GetAsync(accessToken); 
var claims = response.Claims; 

Sie können auch die Liste der Forderungen an die Client-Anwendung bekommen wie -

var claims = HttpContext.User.Claims.ToList(); 

ohne den Endpunkt aufrufen.

Verwandte Themen