2017-11-09 4 views
0

Ein paar Hintergrundinformationen: Ich bin gerade dabei, unseren Oauth-Server auf einen Identitätsserver zu aktualisieren. Wir verwenden hierfür IdentityServer4.Zurückgeben eines Benutzeranspruchs bei Verwendung des ResourceOwnerPassword-Berechtigungstyps

Aus Gründen der Abwärtskompatibilität muss ich so etwas wie ein Dienstkonto erstellen, das es mir ermöglicht, die Identität eines Benutzers anzunehmen. Ich denke, was ich möchte, ist so etwas wie ein Twitter Oauth1 Client. Ich habe versucht, GrantTypes.ResorceOwerPassword

den Client zu verwenden:

new Client 
       { 
        ClientId = "ServiceAccountAccess", 
        // no interactive user, use the clientid/secret for authentication 
        AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, 
        // secret for authentication 
        ClientSecrets = 
        { 
         new Secret("secret".Sha256()) 
        }, 
        // scopes that client has access to 
        AllowedScopes = 
        { 
         "api.full_access" 
        }, 
        AlwaysIncludeUserClaimsInIdToken = true 
       } 

Mein Benutzer:

new TestUser 
      { 
       SubjectId = "1", 
       Username = "alice", 
       Password = "password", 
       Claims = new [] 
       { 
       new Claim("name", "Alice"), 
       new Claim("website", "https://alice.com") 
      } 
      }, 

Verbrauch:

var tokenClient = new TokenClient(disco.TokenEndpoint, "ServiceAccountAccess", "secret"); 
     var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api.full_access"); 

Nun dies tut Arbeit ich in der Lage bin einzuloggen. Das Problem, das ich habe, ist, dass ich keine Möglichkeit habe zu sehen, das ist Alice. Ich habe versucht, eine Benutzerinfo zu machen.

Userinfo rufen

// Get UserInfo 
    var client = new HttpClient(); 
    client.SetBearerToken(tokenResponse.AccessToken); 
    var response = await client.GetAsync(disco.UserInfoEndpoint); 
    if (!response.IsSuccessStatusCode) 
    { 
    Console.WriteLine(response.StatusCode); 
    } 
    else 
    { 
    var content = await response.Content.ReadAsStringAsync(); 
    Console.WriteLine(JArray.Parse(content)); 
    } 

Ergebnisse:

Dies wird mit einem "Unauthorized verboten"

ich die dieser Benutzer muss wissen, zurück.

Antwort

2

Das Problem war, um dem Benutzer Informationen, die Sie Profil und openid benötigen für den Zugriff auf Bereiche

Der Kunde enthalten:

new Client 
       { 
        ClientId = "ServiceAccountAccess", 
        // no interactive user, use the clientid/secret for authentication 
        AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, 
        // secret for authentication 
        ClientSecrets = 
        { 
         new Secret("secret".Sha256()) 
        }, 
        // scopes that client has access to 
        AllowedScopes = 
        { 
         "api.full_access" , 
         IdentityServerConstants.StandardScopes.OpenId, 
         IdentityServerConstants.StandardScopes.Profile 
        }, 
        AlwaysIncludeUserClaimsInIdToken = true 
       } 

Verbrauch:

var tokenClient = new TokenClient(disco.TokenEndpoint, "ServiceAccountAccess", "secret"); 
     var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api.full_access profile openid"); 

Userinfo nennen

// Get UserInfo 
    var client = new HttpClient(); 
    client.SetBearerToken(tokenResponse.AccessToken); 
    var response = await client.GetAsync(disco.UserInfoEndpoint); 
    if (!response.IsSuccessStatusCode) 
    { 
    Console.WriteLine(response.StatusCode); 
    } 
    else 
    { 
    var content = await response.Content.ReadAsStringAsync(); 
    Console.WriteLine(JArray.Parse(content)); 
    } 

Ergebnisse:

{"name":"Alice","website":"https://alice.com","sub":"1"} 

Update:

ich dies nur gefunden in der Dokumentation

Das Zugriffstoken wird nun einen Unter Anspruch enthält, die eindeutig den Benutzer identifiziert. Dieser "Unter" -Anspruch kann durch die Überprüfung der Inhaltsvariablen nach dem Aufruf der API gesehen werden und wird auch auf dem Bildschirm von der Konsolenanwendung angezeigt.

was bedeutet, dass ich es nicht von Userinfo Thema ID anfordern müssen, ist in den Ansprüchen im Zugriffstoken zurück

Verwandte Themen