gpt4 book ai didi

oauth-2.0 - 身份服务器不返回刷新 token

转载 作者:行者123 更新时间:2023-12-03 15:20:18 29 4
gpt4 key购买 nike

我正在尝试设置 Thinktecture 的 Identity Server 3,但在交换授权代码时(或使用 ResourceOwner 流程​​时,我似乎无法让它返回刷新 token ,但我将专注于授权代码因为现在对我来说更重要)。我取回访问 token 并可以使用它们进行身份验证,但它似乎甚至没有生成我期望取回的刷新 token 。我需要做什么特别的事情才能让 Identity Server 返回刷新 token ?

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

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

  • 我使用他们的客户端类创建了一个客户端,手动指定以下内容:var client = new Client()
    {
    ClientId = "SomeId",
    ClientName = "带有验证码流的客户端",
    RequireConsent = false,//将此设置为 true 没有帮助
    Flow = Flows.AuthorizationCode,
    ClientSecrets = 新列表(){
    新的 ClientSecret(" secret ")
    },
    RedirectUris = new List()
    {
    “本地主机:/特定重定向路径”
    }
    };
  • 我正在调用 Authorization 端点,如下所示:var authorizationEndpoint =
    AuthorizationEndpointBase +
    "?client_id="+ Uri.EscapeDataString(Options.ClientId) +
    "&scope=默认"+
    "&response_type=代码"+
    "&redirect_uri="+ Uri.EscapeDataString(redirectUri) +
    "&state="+ Uri.EscapeDataString(state);
    Response.Redirect(authorizationEndpoint);
    其中“默认”是我创建的范围。
  • 在我的回调中,我按如下方式调用 token 端点: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();
    字符串 oauthTokenResponse = 等待 response.Content.ReadAsStringAsync();

  • 当我调用 token 端点时,我在 Identity Server 上的登录显示以下内容(在验证授权代码之后):

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

    我不确定还有什么是相关的,所以我会根据需要提供更多信息。

    最佳答案

    您必须在请求中明确要求“offline_access”。用空格分隔您请求的其他范围。 (在我下面的示例中,我将“默认”替换为“MyApi”,以明确我们正在讨论由您的应用程序定义的范围。)

    &scope=MyApi offline_access 

    但是,您还必须授予该客户端获取刷新 token 的权利,这不仅仅取决于您选择的流程:
    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"

    },
    }

    您可能还需要将“offline_access”添加到作用域存储中。范围存储是 Identity Server 知道的范围列表。你的问题没有提到你的范围存储是如何在你的项目中设置的,所以你可能已经有了它。但是,如果上述内容不能立即为您工作,您可能需要在您正在使用的示例中四处寻找这样的代码并添加 OfflineAccess。
    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"
    },
    }

    关于oauth-2.0 - 身份服务器不返回刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31385593/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com