2017-04-14 1 views
0

Ich schreibe eine IdentityServer4-Implementierung und verwende das Quickstart-Projekt, das here beschrieben wird.Warum werden auf dem IdentityServer4-Einverständnisbildschirm doppelte Bereiche angezeigt?

Wenn Sie eine ApiResource definieren (zunächst mit InMemory-Klassen), sieht es so aus, als ob IdentityServer einen Bereich mit demselben Namen wie die Ressource erstellt. Zum Beispiel

wird ein Scope namens "api" erstellen (dies geschieht im ApiResource-Konstruktor). Wenn ich "api" als zulässiges Scope für mein Client-Objekt (mit InMemoryClients für einen Proof of Concept) hinzufüge und dieses API-Scope im Scroll-Abfragezeichenfolgeparameter in meiner Authentifizierungsanfrage von meinem JavaScript-Client anfordere, erhalte ich eine invalid_scope-Fehlermeldung.

Ich fand durch this documentation folgende Sie können Scopes fügen dem ApiResource durch die Scopes Eigenschaft wie so

new ApiResource 
{ 
    Name = "api", 
    DisplayName = "Custom API", 
    Scopes = new List<Scope> 
    { 
      new Scope("api.read"), 
      new Scope("api.write") 
     } 
} 

jetzt Also, wenn ich stattdessen meine ApiResource wie folgt definieren und fordern Sie die Scopes api.read und api.write (und fügen Sie sie der AllowedScopes-Eigenschaft für das Clientobjekt hinzu), dann funktioniert alles einwandfrei, mit Ausnahme der Zustimmungsseite, die doppelte Bereiche anzeigt. Es zeigt api.read 2 mal und api.write 2 mal. Siehe die Zustimmung Bildschirm hier

enter image description here

Die Client-Konfiguration wie folgt:

new Client 
{ 
    ClientId = "client.implicit", 
    ClientName = "JavaScript Client", 
    AllowedGrantTypes = GrantTypes.Implicit, 
    AllowAccessTokensViaBrowser = true, 
    RedirectUris = { "http://localhost:3000/health-check" }, 
    PostLogoutRedirectUris = { "http://localhost:3000" }, 
    AllowedCorsOrigins =  { "http://localhost:3000" }, 
    AllowedScopes = { 
         IdentityServerConstants.StandardScopes.OpenId, 
         IdentityServerConstants.StandardScopes.Profile, 
         "customApi.read", "customApi.write" 
        } 
} 

Warum ist das passiert? Mache ich etwas offensichtlich falsch?

Update: Hier ein Teil der Entdeckung Dokuments, das das Scopes zeigt nur einmal aufgelistet ...

enter image description here

+0

Wie viele API-Ressourcen haben Sie? Ihre Bereiche werden dupliziert. Bitte denken Sie darüber nach, 'scopes_supported' Inhalte von Ihrem'/.well-known/openid-configuration' Endpunkt zu veröffentlichen. –

+0

@IlyaChumakov Ich postete es.Ich habe definitiv nur eine API-Ressource, also bin ich verloren, warum dies geschieht –

Antwort

1

Es sieht aus wie das Problem mit dem Quickstart-UI ist .. oder mit der Scope.cs Klasse, je nachdem, wie Sie es sehen. Insbesondere wird in dem Verfahren und der Linie in der Klasse gezeigt ConsentService.cs

Der folgende Code

vm.ResourceScopes = resources.ApiResources.SelectMany(x => x.Scopes).Select(x => CreateScopeViewModel(x, vm.ScopesConsented.Contains(x.Name) || model == null)).ToArray(); 

filtert nicht die Duplikate aus. Das heißt, selbst wenn zwei Bereiche denselben Namen haben, werden sie nicht als gleich angesehen. Also, wenn GetHashCode und Equals in Scope.cs überschrieben wurden (das ist in IdentityServer4 - nicht der Quickstart) dann würde es dieses Problem lösen. In diesem Fall würde SelectMany einen eindeutigen Satz zurückgeben. Dies liegt daran, dass die ApiResources-Eigenschaft als HashSet implementiert ist. Alternativ könnten Sie Ihre eigene Logik schreiben, um diese Rückgabe zu einer eindeutigen Gruppe von Gültigkeitsbereichen zu machen. So habe ich das Problem gelöst. Ich schrieb etwas, das Jon Skeets Antwort in this post sehr ähnlich war und die doppelten Scopes herausgefiltert hat.

1

Das Problem liegt in IdentityService4-Code in der Implementierung von InMemoryResourcesStore.FindApiResourcesByScopeAsync und wurde mit dieser commit behoben.Sie können den Zweig dev verwenden, in dem er seit dem 22. Juni 2017 enthalten ist, aber er wurde nie in einem der NuGET-Pakete veröffentlicht, die auf .NET Standard 1.4 abzielen, was sehr ärgerlich ist.

ich ein Problem geschaffen und forderte sie gepatcht zu erhalten: https://github.com/IdentityServer/IdentityServer4/issues/1470

Für die Ansicht Zu i hinzugefügt, um die Linie mit Todo markiert ConsentService.cs

var resources = await _resourceStore.FindEnabledResourcesByScopeAsync(request.ScopesRequested); 
if (resources != null && (resources.IdentityResources.Any() || resources.ApiResources.Any())) 
{ 
    // TODO: Hotfix to cleanup scope duplication: 
    resources.ApiResources = resources.ApiResources.DistinctBy(p => p.Name).ToList(); 
    return CreateConsentViewModel(model, returnUrl, request, client, resources); 
} 

Dies das Display Problem löst, aber die Der Gültigkeitsbereich wird im Zugriffstoken immer noch mehrfach enthalten sein, wodurch er größer wird, da er die Bereichsanzahl für diese API vervierfacht. Ich hatte 3 Scopes, also wurde jeder 3 Mal aufgenommen und es wurden 6 nicht benötigte Scopekopien hinzugefügt. Aber zumindest ist es verwendbar, bis es behoben ist.

Verwandte Themen