【问题标题】:IdentityServer4: How to show external providers consent screen?IdentityServer4:如何显示外部提供商同意屏幕?
【发布时间】:2019-09-07 11:46:17
【问题描述】:

最近刚开始使用 IdentityServer4 (IS4) 玩弄样本等等。

我有一个运行 IS4(使用包含的示例 UI MVC)的设置,将 Google 配置为外部提供程序。我也有一个 API 设置,以及一个客户端(MVC Web 应用程序)。进行身份验证时,用户在“外部登录”部分单击“Google”,他/她将按预期重定向到 Google。但是,在提供用户名和密码后,我希望看到 Google 同意屏幕,但我被重定向回 IS4 中的同意屏幕。这是为什么?最终用户是否应在明显来自 Google 的页面(即 HTTPS 和 Google 证书)上不同意他/她的 Google 个人资料信息正在被访问?

我承认,由于我还需要用户同意才能访问我的 API,我最终可能会看到 2 个同意屏幕(一个用于来自 Google 的个人资料信息,另一个用于通过我自己的 IS4 配置访问 API),但如果我我的设置中没有 API,只是想在联合设置中使用 IS4 来提供 ID 令牌,我不需要我自己的 API 的同意,因此只希望看到我的外部提供商的同意屏幕(例如 Google、Facebook、Twitter 等)。

我的外部提供商配置如下:

services.AddAuthentication()
    .AddGoogle("Google", options =>
    {
        options.ClientId = "<my client id>";
        options.ClientSecret = "<my client secret>";
        options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
    });

有人可以告诉我:-)

谢谢

【问题讨论】:

    标签: oauth-2.0 identityserver4 google-authentication openid-connect


    【解决方案1】:

    From Google' help:

    设置项目的同意屏幕并请求验证:

    1. 转到 Google API 控制台OAuth consent screen 页面。
    2. 添加所需信息,例如产品名称和支持电子邮件地址。
    3. 点击添加范围
    4. 在出现的对话框中,选择您的项目使用的范围。敏感范围会在 API 名称旁边显示一个锁定图标。
      • 要选择注册范围,您需要从 API 和服务 > API 库启用 API,例如 Drive 或 Gmail。
      • 您必须选择项目使用的所有范围。
    5. 完成向 OAuth 同意屏幕添加详细信息后,单击提交以供验证
    6. 需要验证窗口显示。
    7. 添加范围说明、联系电子邮件地址和任何其他有助于团队验证的信息,然后单击提交。

    注意:同意屏幕 控制台中的设置是在项目级别设置的,因此 您在同意屏幕页面上指定的信息适用于 整个项目。

    因此,您需要在 IdSrv 中为您的客户禁用同意并在 Google 中启用它。

    另外,如this answer 中所述,

    根据设计,同意屏幕不会显示在仅要求帐户选择和个人资料/电子邮件范围的场景中...,因为帐户选择 UI 已经显示了电子邮件和个人资料(姓名/图片)将与应用共享的信息。

    @Mike Wilcox补充:

    包含敏感/受限范围时,如果未针对添加的范围进行验证,您将在同意 oauth 流程中看到未验证屏幕。你可以通过点击advanced - > go to [app_name] (unsafe)

    有一个游乐场:https://developers.google.com/oauthplayground/,您可以在其中进行测试。
    点击右上角的设置图标,然后选中“使用您自己的 OAuth 凭据” 框以然后输入您的应用程序信用。您可以添加范围并在那里进行测试。

    【讨论】:

    • 这正是我所做的,除了我不需要 Google 中的任何 API 范围(如 Drive、Gmail 等)而只需要个人资料信息;因此,我将其保留为 3 个标准范围(电子邮件、配置文件和 openid)。但是,这似乎不会触发同意屏幕。但正如它在提示文本中所说的那样,“如果您添加敏感范围,......,Google 将验证您的同意屏幕......”可能是我没有看到屏幕的原因。访问默认范围不需要同意是真的吗?
    • 另外,如果我添加了敏感范围,似乎我需要谷歌验证才能发布范围更改;我现在不想这样做,因为我基本上只是在尝试。有没有办法在测试床/沙盒环境中做到这一点?
    • 另见stackoverflow.com/a/44167549/1426685 不是很新鲜,上次更新是一年前,但仅此而已
    • 答案下方的 cmets 中有一些来自 google guy 的扩展解释
    • 添加敏感/受限范围时,如果未对添加的范围进行验证,您将在同意 oauth 流程中看到未经验证的屏幕。您仍然可以通过单击高级访问 -> 转到 [app_name](不安全)有一个游乐场 developers.google.com/oauthplayground 可以在其中进行测试。单击右上角的设置图标,然后单击单选“使用您自己的 OAuth 凭据”,然后输入您的应用程序凭据。您可以添加范围并在那里进行测试。
    【解决方案2】:

    当您重定向到外部 idp 时,您无法控制,因为它是委托身份验证。我不知道 Google 如何实施他们的 OAuth 流程,但以下可能是未显示同意屏幕的原因:

    • 您没有请求任何需要用户同意的范围
    • 用户已同意您的客户访问他/她的信息(您应该可以在 Google 帐户页面中查看这一点)
    • 您的客户端配置为绕过同意屏幕(在 IDS4 中可以通过将 RequireConsent 标志设置为 false,但我怀疑您是否可以在 Google 作为第 3 方 OAuth 客户端执行此操作)

    【讨论】:

    • 您的第一个子弹可能是这种情况(请参阅上面的回复我的 cmets)。但是我真的不知道如何请求一个需要同意的范围(即敏感范围)而不必经过谷歌验证过程;目前只是在玩,做概念验证,并试图了解它是如何工作的。要点 2:我在每次尝试前撤销访问权限并注销。项目符号 3:试图搞砸这一点,但它不会影响 Google 的行为方式,只会影响 IS4 的行为方式(自然)。
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2020-05-02
    • 2017-07-10
    相关资源
    最近更新 更多