身份服务器未返回刷新令牌

问题描述 投票:15回答:2

我正在尝试设置Thinktecture的Identity Server 3,但是在交换授权码(或使用ResourceOwner流时,我似乎无法让它返回刷新令牌),但是我将重点关注授权代码,因为它对我来说现在更重要)。我获得了访问令牌,并可以使用它们来进行身份验证,但是它似乎甚至没有生成我希望返回的刷新令牌。要使Identity Server返回刷新令牌,我需要做些特殊的事情吗?

我浏览了文档,但没有看到我设置有误的任何内容,并且他们在refresh tokens上的页面上唯一没有做的就是在出现以下情况时明确请求“ offline_access”范围将用户发送到那里进行身份验证,因为每次尝试时都会收到“无效范围”错误。因此,我采用Thinktecture的“请求offline_access范围(通过代码或资源所有者流)”的措辞,以表示offline_access范围是根据您所使用的流自动请求的内容。

我一直在尽力遵循他们的示例应用程序(以及Katana Project中现有的Owin中间件的源代码,我的设置如下:

  • 我已经使用其客户端类创建了一个客户端,并手动指定了以下内容:
    var client = new Client(){ClientId =“ SomeId”,ClientName =“具有身份验证代码流的客户端”,RequireConsent = false,//将此设置为true并没有帮助流= Flows.AuthorizationCode,ClientSecrets = new List(){新的ClientSecret(“ secret”)},RedirectUris =新的List(){“本地主机:/ specific-redirect-path”}};
  • 我正在按如下方式拨打到Authorization端点:
    varauthorizationEndpoint =AuthorizationEndpointBase +“?client_id =” + Uri.EscapeDataString(Options.ClientId)+“&scope =默认” +“&response_type = code” +“&redirect_uri =” + Uri.EscapeDataString(redirectUri)+“&state =” + Uri.EscapeDataString(state);Response.Redirect(authorizationEndpoint);
    其中“默认”是我创建的范围。
  • 在我的回调中,我按如下方式调用令牌端点:
    IReadableStringCollection查询= Request.Query;字符串代码= getValueFromQueryString(“ code”,q​​uery);var tokenRequestParameters = new List>(){新的KeyValuePair(“ client_id”,Options.ClientId),新的KeyValuePair(“ redirect_uri”,GenerateRedirectUri()),新的KeyValuePair(“ client_secret”,Options.ClientSecret),新的KeyValuePair(“ code”,code),新的KeyValuePair(“ grant_type”,“ authorization_code”),};var requestContent = new FormUrlEncodedContent(tokenRequestParameters);HttpResponseMessage response =等待_httpClient.PostAsync(TokenEndpoint,requestContent,Request.CallCancelled);response.EnsureSuccessStatusCode();字符串oauthTokenResponse =等待响应。Content.ReadAsStringAsync();

当我调用令牌端点时,我在Identity Server上的登录将显示以下内容(在验证授权码之后:]

iisexpress.exe信息:0:[Thinktecture.IdentityServer.Core.Validation.TokenRequestValidator]:7/13/2015 1:44:07 PM +00:00-令牌请求验证成功{“ ClientId”:“ SomeId”,“ ClientName”:“具有验证码流的客户端”,“ GrantType”:“ authorization_code”,“授权代码”:“ f8f795e649044067ebd96a341c5af8c3”}iisexpress.exe信息:0:[Thinktecture.IdentityServer.Core.ResponseHandling.TokenResponseGenerator]:7/13/2015 1:44:07 PM +00:00-创建令牌响应iisexpress.exe信息:0:[Thinktecture.IdentityServer.Core.ResponseHandling.TokenResponseGenerator]:2015/7/13 1:44:07 PM +00:00-处理授权码请求调试:[Thinktecture.IdentityServer.Core.Services.Default.DefaultTokenService]:2015年7月13日1:44:07 PM +00:00-创建访问令牌调试:[Thinktecture.IdentityServer.Core.Services.Default.DefaultTokenService]:2015年7月13日1:44:07 PM +00:00-创建参考访问令牌iisexpress.exe信息:0:[Thinktecture.IdentityServer.Core.Endpoints.TokenEndpointController]:2015/7/13下午1:44:07 +00:00-结束令牌请求iisexpress.exe信息:0:[Thinktecture.IdentityServer.Core.Results.TokenResult]:2015年7月13日1:44:07 PM +00:00-返回令牌响应。

我不确定还有什么其他意义,所以我将根据需要提供更多信息。

oauth-2.0 identityserver3
2个回答
31
投票

您必须在请求中明确要求'offline_access'。用空格分隔您要请求的其他作用域。 (在下面的示例中,我将“ Default”替换为“ MyApi”,这很清楚我们正在谈论的是您的应用定义的范围。)


0
投票

发送令牌请求时在范围内添加offline_access值

© www.soinside.com 2019 - 2024. All rights reserved.