【问题标题】:How to get Authorization Code using Identity Server 4 Authorization Code Grant Type Flow如何使用 Identity Server 4 授权码授予类型流程获取授权码
【发布时间】:2020-04-28 06:04:34
【问题描述】:

我正在使用 dotnet core (.NET Core) 3.1 和 IdentityServer4 包。我有一个希望与 Identity Server 4 集成的 SPA,因此我将沿着使用 PKCE 的 Authorization Code 授权类型的路径前进。我了解这种授权类型的基本概念,但是我不明白如何将用户名/密码换成授权码。这是我的理解。

  1. SPA 向 /authorize 端点发出 GET 请求,类似于 http://localhost:5000/connect/authorize?client_id=js&redirect_uri=http://localhost:5003/callback.html&response_type=code&scope=openid profile api1&state=8636d5233f77413584799be6cafe03a7&code_challenge=FbNm1tMkaRMzcSBv4_d5Rpq4VNaqyINVkCAcHsZkKV0&code_challenge_method=S256&response_mode=query
  2. 这会返回一个 302 重定向到 http://localhost:5000/Account/Login,我认为它应该是由身份验证服务器托管的登录屏幕。
  3. 用户提交他们的凭据,身份验证服务器验证凭据并返回另一个 302 重定向到给定的重定向 URL,在这种情况下为 http://localhost:5003/callback.html。重定向 url 应包含生成的授权码和查询字符串中提供的状态。
  4. SPA 验证状态,然后向 /token 端点发出请求,该端点包含在标头中:authorization=Basic Y2xpZW50OnNlY3JldA== 和查询字符串中:grant_type=authorization_code, code=授权代码, redirect_uri=http://localhost/redirect
  5. 身份验证服务器返回一个有效的令牌。

我已经完成了第 1 步和第 2 步(还没有 UI,但这并不重要)。调用 /authorize 是有效的。我收到了有效的 302 响应。我卡住的地方是第 3 步和第 4 步。我是否需要编写一个端点来生成 授权代码 并返回包含它的 302 重定向,或者这是否已经内置到 Identity Server 4 中(像 /authorize 和 /token 端点)?

我整理了一些我在网上找到的例子,包括这个https://identityserver4.readthedocs.io/en/latest/quickstarts/4_javascript_client.html。似乎没有任何使用这种授权类型的完整示例。我还在我的创业公司中加入了一些测试资源、客户和用户。

services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiResources(Config.GetAllApiResources())
    .AddInMemoryClients(Config.GetClients())
    .AddTestUsers(Config.GetUsers());

感谢您提供的任何帮助,至少将我推向正确的方向。

【问题讨论】:

    标签: .net-core oauth-2.0 identityserver4 openid-connect


    【解决方案1】:

    看看这个quickstart。特别是帐户控制器中用于验证凭据的login action

    有两个重要步骤:

    1. Sign in 到 Identity Server(默认通过 cookie)
    2. Redirectview 加载 this javascript 以获得更好的 PKCE 体验。 url 包含由身份服务器生成和管理的查询参数 codestate

    【讨论】:

    • 根据我在上一个答案中的评论,我没有考虑使用模板。我会看看这些,看看我哪里出错了。
    【解决方案2】:

    对于第 3 步,您确实需要提供 ui/endpoint 以供用户登录

    IdentityServer4 团队通过创建一个您只需导入即可 这是模板的链接 - https://github.com/IdentityServer/IdentityServer4.Templates

    在你的情况下,我认为你需要 is4ui 模板

    【讨论】:

    • 我没有考虑过使用模板,而是参考了文档和示例。将通过其中一些来了解他们如何实现这一目标。
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2018-01-12
    • 2021-03-06
    • 2020-02-26
    • 2019-01-09
    • 2018-11-04
    • 2020-05-05
    • 2021-04-24
    相关资源
    最近更新 更多