asp.net核心身份验证AddMicrosoftAccount

时间:2019-07-10 14:27:49

标签: asp.net-core identityserver4

我已将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");
                    });

我不知道如何请求其他范围,上述方法不起作用,因为从未返回对“配置文件”或“电子邮件”的声明。

有人知道如何做到这一点吗?

2 个答案:

答案 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)

  

我不知道如何请求其他范围,以上内容不起作用,因为从未返回对“个人资料”或“电子邮件”的声明。

openidemailprofileoffline_accessOpenID 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。