2015-07-13 8 views
13

Ich versuche, Thinktecture Identity Server 3 einzurichten, aber ich kann nicht scheinen, es ein Refresh-Token beim Austauschen eines Autorisierungscodes zurückzugeben (oder wenn ich den ResourceOwner-Fluss verwende, aber ich Ich werde mich auf den Autorisierungscode konzentrieren, da er für mich jetzt wichtiger ist. Ich bekomme Zugangstoken zurück und kann sie benutzen, um mich gut zu authentifizieren, aber es scheint nicht einmal die Aktualisierungstokens zu erzeugen, von denen ich erwarte, dass sie zurückkommen. Gibt es etwas Spezielles, das ich tun muss, damit Identity Server Refresh-Token zurückgibt?Identity Server gibt Refresh-Token nicht zurück

Ich habe die Dokumentation durchgesehen, aber habe nichts gesehen, dass ich falsch eingerichtet habe, und das einzige Ding auf ihrer Seite auf refresh tokens, das ich nicht mache, fordert explizit den "offline_access" Bereich wenn Senden Sie den Benutzer für die Authentifizierung, da, wenn ich versuche, bekomme ich einen Fehler "ungültiger Bereich". Daher nehme ich die Formulierung von Thinktecture von "Fordern Sie den Bereich offline_access (über Code- oder Ressourceneignerfluss)" an, dass der Bereich offline_access automatisch auf der Grundlage des von Ihnen verwendeten Datenflusses angefordert wird.

Ich habe versucht, ihre Beispielanwendungen zu folgen (und der Quellcode für die bestehende Owin Middleware aus dem Katana Project) so gut ich kann, und mein Setup ist wie folgt:

  • ich erstellt habe ein Client, der ihre Clientklasse verwendet und Folgendes manuell angibt:
     
    var client = new Client() 
    { 
        ClientId = "SomeId", 
        ClientName = "Client with Authentication Code Flow", 
        RequireConsent = false, //Setting this to true didn't help 
        Flow = Flows.AuthorizationCode, 
        ClientSecrets = new List() { 
         new ClientSecret("secret") 
        }, 
        RedirectUris = new List() 
        { 
         "localhost:/specific-redirect-path" 
        } 
    };
  • Ich rufe den Autorisierungsendpunkt wie folgt an:
     
    var authorizationEndpoint = 
        AuthorizationEndpointBase + 
        "?client_id=" + Uri.EscapeDataString(Options.ClientId) + 
        "&scope=Default" + 
        "&response_type=code" + 
        "&redirect_uri=" + Uri.EscapeDataString(redirectUri) + 
        "&state=" + Uri.EscapeDataString(state); 
    Response.Redirect(authorizationEndpoint);
    Dabei ist "Standard" ein Bereich, den ich erstellt habe.
  • In meinem Rückruf, nenne ich den Token-Endpunkt wie folgt:
     
    IReadableStringCollection query = Request.Query; 
    string code = getValueFromQueryString("code", query); 
    var tokenRequestParameters = new List>() 
        { 
         new KeyValuePair("client_id", Options.ClientId), 
         new KeyValuePair("redirect_uri", GenerateRedirectUri()), 
         new KeyValuePair("client_secret", Options.ClientSecret), 
         new KeyValuePair("code", code), 
         new KeyValuePair("grant_type", "authorization_code"), 
        }; 
    var requestContent = new FormUrlEncodedContent(tokenRequestParameters); 
    HttpResponseMessage response = await _httpClient.PostAsync(TokenEndpoint, requestContent, Request.CallCancelled); 
    response.EnsureSuccessStatusCode(); 
    string oauthTokenResponse = await response.Content.ReadAsStringAsync(); 
    

Als ich den Anruf an den Token-Endpunkt machen, meine Protokollierung auf Identity Server folgende zeigt (nach der Validierung der Autorisierungscode):

 iisexpress.exe Information: 0 : [Thinktecture.IdentityServer.Core.Validation.TokenRequestValidator]: 7/13/2015 1:44:07 PM +00:00 -- Token request validation success 
    { 
     "ClientId": "SomeId", 
     "ClientName": "Client with Authentication Code Flow", 
     "GrantType": "authorization_code", 
     "AuthorizationCode": "f8f795e649044067ebd96a341c5af8c3" 
    } 
    iisexpress.exe Information: 0 : [Thinktecture.IdentityServer.Core.ResponseHandling.TokenResponseGenerator]: 7/13/2015 1:44:07 PM +00:00 -- Creating token response 
    iisexpress.exe Information: 0 : [Thinktecture.IdentityServer.Core.ResponseHandling.TokenResponseGenerator]: 7/13/2015 1:44:07 PM +00:00 -- Processing authorization code request 
    Debug: [Thinktecture.IdentityServer.Core.Services.Default.DefaultTokenService]: 7/13/2015 1:44:07 PM +00:00 -- Creating access token 
    Debug: [Thinktecture.IdentityServer.Core.Services.Default.DefaultTokenService]: 7/13/2015 1:44:07 PM +00:00 -- Creating reference access token 
    iisexpress.exe Information: 0 : [Thinktecture.IdentityServer.Core.Endpoints.TokenEndpointController]: 7/13/2015 1:44:07 PM +00:00 -- End token request 
    iisexpress.exe Information: 0 : [Thinktecture.IdentityServer.Core.Results.TokenResult]: 7/13/2015 1:44:07 PM +00:00 -- Returning token response.

Ich bin mir nicht sicher, was sonst relevant wäre, also werde ich mehr Informationen bei Bedarf bereitstellen.

+0

Hallo, Entschuldigung für nicht verwandten Kommentar, aber gibt es sowieso ich kann die Vorlage, die Sie mit Identity-Server erstellt haben, die Refresh-Tokens, etc. generiert? –

+0

Leider habe ich das als Teil einer Mitarbeitervergrößerung aufgebaut, auf die ich nicht mehr stehe, also habe ich weder Zugriff auf die Codebasis noch die Erlaubnis, sie zu posten. –

Antwort

27

Sie müssen in Ihrer Anfrage explizit nach 'offline_access' fragen. Trennen Sie die anderen Bereiche, die Sie anfordern, mit einem Leerzeichen. (In meinen folgenden Beispielen I ‚Default‘ mit ‚MyApi‘ bin ersetzen klar sein, dass wir über einen Umfang von Ihrer App definiert sprechen.)

&scope=MyApi offline_access 

Sie müssen jedoch auch, dass Auftraggeber das Recht gewähren zu erhalten refresh Token, ist es nicht nur auf die Strömung happen basierend Sie wählen:

var client = new Client() 
{ 
    ... //All the stuff you were doing before 

    ScopeRestrictions = new List<string> 
    { 
     "MyApi", 
     StandardScopes.OfflineAccess.Name, //"offline_access" -for refresh tokens 
     //Other commonly requested scopes: 
     //StandardScopes.OpenId.Name, //"openid" 
     //StandardScopes.Email.Name, //"email" 

    }, 
} 

Sie müssen möglicherweise ‚offline_access‘ auf Ihrem Umfang speichern und hinzuzufügen. Der Oszilloskopspeicher ist die Liste der Bereiche, die Identity Server kennt. In Ihrer Frage wird nicht erwähnt, wie Ihr Oszilloskopspeicher in Ihrem Projekt eingerichtet ist, sodass Sie es möglicherweise bereits haben. Aber wenn das obige nicht sofort für Sie funktioniert, sollten Sie in dem Beispiel, in dem Sie arbeiten, nach Code wie diesem suchen und OfflineAccess hinzufügen.

+1

Danke, das ist es!Ich weiß nicht, wie ich es geschafft habe, aber irgendwie wurde das Oszilloskop nicht aufgenommen, als ich die StandardScopes der Datenbank hinzufügte, und es gelang mir immer noch, es zu übersehen, wenn ich sie früher manuell ansah, weshalb ich das dachte vielleicht war es automatisch magisch bestimmt. Das macht VIEL mehr Sinn. –

+2

Ich hatte vergessen, den "StandardScopes.OfflineAccess" in meinen Oszilloskopspeicher aufzunehmen, danke, dass ich diesen Teil erwähnt habe. – Joshua

+1

Ein Hinweis: StandardScopes.All enthält nicht den Offline-Zugriffsbereich. (Was meiner Meinung nach sehr seltsam ist). – jinavar1