我正在尝试使用Microsoft帐户作为IdentityServer4中的外部登录,我在Microsoft Application门户下创建了一个新应用程序,并将其配置如下:
以下是我在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电子邮件无效
答案 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
)。在我的示例中执行此操作,我仍然在我的示例中获得相同的声明列表,该列表由nameidentifier
,name
,givenname
,surname
和emailaddress
组成。这可以解释为什么默认情况下不会请求OpenID特定范围。