2015-07-13 16 views
13

Thinktecture'ın Identity Server 3'ü kurmaya çalışıyorum, ancak bir yetkilendirme kodu değiştirirken (veya ResourceOwner akışını kullanırken, bir yenileme belirtecini döndürmek için bulamıyorum) Şu anda benim için daha önemli olan yetkilendirme koduna odaklanacağım. Erişim belirteçlerine geri dönüyorum ve bunları doğrulamak için kullanabilirim, ancak geri dönmeyi umduğum yenileme belirteçlerini oluşturuyor gibi görünmüyor. Identity Server'ı yenileme belirteçlerine döndürmek için yapmam gereken özel bir şey var mı?Kimlik Sunucusu yenileme jetonunu iade etmiyor

Belgeleri inceledim, ancak yanlış ayarladığım bir şey görmedim ve sayfadaki refresh tokens numaralı sayfada bulunan tek şey açıkça "offline_access" kapsamını talep ediyor Kullanıcıyı kimlik doğrulaması için gönderme, çünkü ne zaman denediğimde bir "geçersiz kapsam" hatası alıyorum. Bu nedenle, kullandığınız akışa bağlı olarak, offline_access kapsamının otomatik olarak istenen bir şey olduğunu belirtmek için, Thinktecture'ın "Çevrimdışı_asarım kapsamını (kod veya kaynak sahibi akışı aracılığıyla)" ifadesini alıyorum.

  • oluşturduğum: Benim kurulduğundan Olabilirim ve en iyi olarak aşağıdaki gibi onların örnek uygulamalarını (Ve Katana Project mevcut Owin Middleware için kaynak kodunu) takip etmeye çalışıyorum

    İstemci sınıfını kullanarak, aşağıdakileri manuel olarak belirleyen bir istemci:

     
    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" 
        } 
    };
  • Yetkilendirme bitiş noktasına aşağıdaki gibi bir çağrı yapıyorum:
     
    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);
    Burada "Varsayılan" oluşturulan bir kapsamdır.
     
    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(); 
    

Ben belirteç bitiş noktasına arama yapmak, Kimlik Server benim günlüğü görüntüler (yetki kodu doğrulama sonra) şu şu şekildedir: Benim Geri arama durumunda

  • , ben belirteç son nokta diyoruz:

     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.

    Başka ne uygun olacağından emin değilim, bu yüzden gerektiğinde daha fazla bilgi sağlayacağım.

  • +0

    Merhaba, alakasız yorumunuz için üzgünüm, ancak yine de, kimlik belirteçleri üreten vb kimlik sunucusunu kullanarak oluşturduğunuz şablonu alabilir miyim? –

    +0

    Ne yazık ki, ben artık üzerinde değilim bir personel artırmanın bir parçası olarak inşa ediyordu, bu yüzden kod tabanına erişim veya postalama izni yok. –

    cevap

    27

    İsteğiniz doğrultusunda 'offline_access' için açıkça talep etmeniz gerekir. Bir alanla talep ettiğiniz diğer kapsamları ayırın. (Benim örneklerde ben 'MyAPI' biz uygulama tarafından tanımlanan bir kapsam bahsediyoruz vurgulamak için yapılmış. Ile 'Varsayılan' yerine am aşağıda)

    &scope=MyApi offline_access 
    

    Ancak, aynı zamanda elde etmek söz konusu müşteriye hakkını vermek zorundadır Siz de kapsam deposuna 'offline_access' eklemeniz gerekebilir

    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" 
    
        }, 
    } 
    

    : belirteçleri yenilemek, sadece seçtiğiniz akışına dayalı olmaz. Kapsam deposu, Identity Server'ın bildiği kapsamların listesidir. Sorunuz, kapsam mağazanızın projenizde nasıl kurulduğundan bahsetmiyor, dolayısıyla zaten sahip olabilirsiniz. Ancak, yukarıdaki işlemler sizin için hemen işe yaramıyorsa, çalıştığınız örnekte bu kod için etrafınıza bakmak isteyebilir ve OfflineAccess'i ekleyebilirsiniz.

    var scopeStore = new InMemoryScopeStore(new Scope[]{ 
        StandardScopes.OpenId, 
        StandardScopes.Profile, 
        StandardScopes.Email, 
        StandardScopes.OfflineAccess, //<--- ensure this is here to allow refresh tokens 
        new Scope{ 
         Enabled = true, 
         Name = "MyApi" 
        }, 
    } 
    
    +1

    Teşekkürler, bu yaptı!Bunu nasıl çözdüğümü bilmiyorum, ancak bir şekilde standart veritabanlarını veritabanına eklediğimde kapsam dahil edilmedi ve daha önce manuel olarak baktığımda bunu kaçırmayı başardım. Belki de otomatik olarak büyülü olarak belirlendi. Bu ÇOK daha mantıklı. –

    +2

    Kapsam mağazamda 'StandardScopes.OfflineAccess' öğesini eklemeyi unutmuştum, bu bölümü söylediğim için teşekkürler. – Joshua

    +1

    Bir not: StandardScopes.All çevrimdışı erişim kapsamını içermez. (Bu benim düşüncemde çok garip). – jinavar1

    İlgili konular