我已将Microsoft身份验证添加到我的应用程序,如下所示:
services.AddAuthentication()
.AddMicrosoftAccount(options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = Configuration["Authentication:Microsoft:ClientId"];
options.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
options.Scope.Add("openid profile email");
});
我不知道如何请求其他范围,上述方法不起作用,因为从未返回对“配置文件”或“电子邮件”的声明。
有人知道如何做到这一点吗?
答案 0 :(得分:0)
MicrosoftAccountOptions
默认包含graph.microsoft.com/user.read
范围,因此在完成流程之后,您的Identity
应该具有用户信息,而没有任何其他窍门。但是AddMicrosoftAccount
实际上是具有特定预设的AddOAuth
,可以作废。因此,它无法为您提供openid
范围。
最新的替代方法是使用OpenId Connect。您可以直接添加as it was presented in Identityserver samples,也可以使用MS的专用扩展名,方法是:
Microsoft.AspNetCore.Authentication.AzureAD.UI
软件包和以下this quickstart
您可以在其中一一添加oidc范围:
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Authority = options.Authority + "/v2.0/"; // Microsoft identity platform
options.TokenValidationParameters.ValidateIssuer = false; // accept several tenants
options.Scope.Add("email");
});
答案 1 :(得分:0)
我不知道如何请求其他范围,以上内容不起作用,因为从未返回对“个人资料”或“电子邮件”的声明。
openid
,email
,profile
和offline_access
是OpenID Connect
范围。问题是AddMicrosoftAccount
使用的是OAuth 2.0
代码流,而不是OpenID Connect。这样作用域就不起作用了。
使用AddMicrosoftAccount
时,默认情况下会将范围设置为https://graph.microsoft.com/user.read
,这意味着它将获得访问令牌,您可以使用该令牌来使用Microsoft Graph访问用户的基本信息,然后重定向回您的应用程序从Microsoft登录页面开始,该扩展程序将向Microsoft Graph端点(https://graph.microsoft.com/v1.0/me)发送带有访问令牌的http发布请求以获取用户信息并创建拍卖票,请参见源代码here。
如果要使用Openid Connect
,则应使用AddOpenIdConnect扩展名。而且,如果您使用的是Azure AD,则最好使用Openid Connect。