了解 ASP.NET Core Identity 中的 oauth 外部登录身份验证流程

Understanding oauth external login authentication flow in ASP.NET Core Identity

我在 ASP.NET 核心 3 中实现身份,在理解外部登录身份验证流程时遇到一些问题,我的用户也是如此。

事情开始就够清楚了:

不出所料,系统提示我选择 Google 身份:

此时我希望看到如下对话框,请求允许我的应用程序访问 Google 身份的各个部分:

但那个对话从未发生过。

接下来发生的事情是:

上述流程步骤对于我见过的任何 oauth 流程来说似乎完全不符合标准。我已经给了它我正在使用的 Google 身份;电子邮件地址是明确的。所以这个对话框看起来无关紧要,只会让我的用户感到困惑。 这一步是不是有我不理解的原因?

...回到上面我期望到达那里的权限对话框,这从来没有发生过。 为什么应用能够接受 Google 登录 而无需 通过该对话框授予访问权限?

Why is the app able to accept a Google login without granting access via that dialog?

似乎 Google 会在创建应用程序后自动授予 OpenID Connect Scopes(openid profile email)。您可以在控制台中验证范围 --> OAuth 同意屏幕:

但如果您还需要额外的敏感范围,您仍然需要在身份验证期间动态授予权限:

services.AddAuthentication()
.AddGoogle(options =>
{
    options.Scope.Add("https://www.googleapis.com/auth/gmail.modify");
    options.Scope.Add("https://www.googleapis.com/auth/gmail.settings.basic");
    options.ClientId = "xxxx";
    options.ClientSecret = "xxxx";
});

Is there a reason for this step that I am not understanding?

那是因为您启用了 ASP.NET 核心标识。在asp.net core identity中,对于外部登录,身份验证后,identity会帮助创建一个与外部登录用户关联的本地用户。scaffolding Identity in ASP.NET Core projects之后,你可以查看[=13]里面的ExternalLogin.cshtml.cs文件=]文件夹。在函数OnGetCallbackAsync中会发现identity会检查外部登录用户信息,确认本地用户与外部用户关联,如果是,则登录用户;如果没有,它会将用户重定向到另一个页面,要求用户在本地数据库中创建一个帐户。

如果您不需要该功能,只需删除 asp.net 核心身份或自定义 OnGetCallbackAsync 功能以跳过该过程。