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

时间:2017-11-18 10:14:22

标签: c# asp.net-core identityserver4

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

  1. 我添加了新的网络平台
  2. 在委派权限下我添加了以下权限
    • User.Read
    • 电子邮件
    • openId
    • 资料
  3. 以下是我在IdentityServer4中使用的代码,通过添加电子邮件作为范围来访问Microsoft帐户:

    services.AddAuthentication()
        .AddMicrosoftAccount("MicrosoftAccount", options =>
        {
            options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
    
            options.ClientId = "ClientId";
            options.ClientSecret = "ClientSecret";
            options.Scope.Add("email");
    
    });
    

    但在尝试访问Microsoft帐户时,我收到以下错误

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

1 个答案:

答案 0 :(得分:2)

使用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特定范围。