【问题标题】:IdentityServer4 - The provided value for the input parameter 'scope' is not valid. The scope https://graph.microsoft.com/user.read email is not validIdentityServer4 - 为输入参数“范围”提供的值无效。范围 https://graph.microsoft.com/user.read 电子邮件无效
【发布时间】:2017-11-19 17:37:39
【问题描述】:

我正在尝试使用 Microsoft 帐户作为 IdentityServer4 中的外部登录,我在 Microsoft 应用程序门户下创建了一个新应用程序并将其配置如下:

  1. 我添加了新的网络平台
  2. 在委派权限下我添加了以下权限
    • User.Read
    • 电子邮件
    • openId
    • 简介

这是我在 IdentityServer4 中使用的代码,通过添加电子邮件作为范围来访问 Microsoft 帐户:

services.AddAuthentication()
    .AddMicrosoftAccount("MicrosoftAccount", options =>
    {
        options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

        options.ClientId = "ClientId";
        options.ClientSecret = "ClientSecret";
        options.Scope.Add("email");

});

但在尝试访问 Microsoft 帐户时出现以下错误

为输入参数“范围”提供的值无效。范围https://graph.microsoft.com/user.read 电子邮件无效

【问题讨论】:

    标签: c# asp.net-core identityserver4


    【解决方案1】:

    使用 OpenID Connect 时,您必须始终在请求的范围列表中包含 openid。为了完整起见,这是一个工作设置:

    options.Scope.Add("openid");
    options.Scope.Add("email");
    

    这由 Microsoft here 记录:

    如果应用使用 OpenID Connect 进行登录,它必须请求 openid 范围。

    它实际上只是 OpenID spec 的一部分:

    OpenID Connect 请求必须包含 openid 范围值。如果 openid 范围值不存在,则行为完全未指定。可能存在其他范围值。应用程序无法理解的范围值应该被忽略。

    在 ASP.NET Core only sets the user.read scope 中默认实现的 Microsoft 帐户,这就是您需要自己添加的原因。似乎 ASP.NET Core 中的 Google 实现确实 include the openid scope 默认情况下,这解释了为什么您可能会看到不同的提供程序的不同结果。

    鉴于您已将 profile 范围添加到委派权限列表中,您可能还希望将其包含在您请求的范围列表中。

    这解释了您的错误的原因,但更简单的方法可能是完全不理会请求的范围列表(仅使用默认值 user.read)。在我的示例中执行此操作后,我仍然会在示例中获得相同的声明列表,该列表由nameidentifiernamegivennamesurnameemailaddress 组成。这可以解释为什么默认情况下不请求 OpenID 特定范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 2023-02-01
      • 2019-12-05
      • 2021-06-03
      • 2021-03-29
      • 1970-01-01
      • 2021-12-31
      • 2020-03-08
      相关资源
      最近更新 更多