0

我已经使用 Microsoft.AspNetCore.Identity 和外部登录以及 Angular 8 前端构建了一个 ASP.NET Core 网站。这基本上是我控制器中的代码:

[Controller]
[Route("web/[controller]")]
public class AccountController : Controller
{
    // GET: web/Account/connect/{provider}
    [AllowAnonymous]
    [HttpGet("connect/{provider}", Name = "web-account-external-connect-challenge")]
    public async Task<ActionResult> ExternalLogin(string provider)
    {
        var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { provider });
        var properties = signin_manager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
        return Challenge(properties, provider);
    }

    // GET: web/Account/connect/{provider}/callback
    [HttpGet("connect/{provider}/callback", Name = "web-account-external-connect-callback")]
    public async Task<ActionResult> ExternalLoginCallback([FromRoute]string provider)
    {
        ...
    }
}

因此,当访问/web/Account/connect/Facebook时,您应该获得 Facebook 登录页面。成功登录后,FB 将重定向到 ExternalLoginCallback,应用程序将处理登录(创建帐户,登录)。

最后警告通知有关 CORB

现在看来我被CORB击中了(以前从未听说过)。我知道 CORS,但 CORB 对我来说是新的。

您可以在这里一窥动作。

  • 请打开一个访客窗口(为了不自动登录)
  • 按 F12 打开开发者工具
  • 导航到https://mintplayer.com/account/login
  • 单击社交登录按钮,弹出窗口出现但带有角度应用程序的 404 页面(这也是误导)
  • 按 F12 打开弹出窗口的开发人员工具
  • 出现以下消息

跨域读取阻止 (CORB) 阻止了跨域响应 https://www.facebook.com/login.php?skip_api_login=1&api_key=...&kid_directed_site=0&app_id=...&signed_next=1&next=...&display= page&locale=nl_NL&pl_dbl=0 ,MIME 类型为 text/html。有关详细信息,请参阅 https://www.chromestatus.com/feature/5629709824032768 。

该应用程序始终显示 NotFoundComponent,但只有在按下 ctrl+F5(清除缓存)后才会显示 Facebook 登录页面。现在缓存清除与它无关,问题肯定是CORB。

return Challenge() 似乎正在立即从 Facebook 呈现登录页面,而我自己的 URL 上没有 iframe。

Postman 中相同请求的响应

我不明白我应该如何解决这个问题。我是否应该Access-Control-Allow-Origin在响应中添加标题以允许我的应用程序加载/重定向到 Facebook/Twitter/Google/Microsoft 登录页面?但我不打算肯定允许所有来源......

PS。它在 localhost/development 上运行良好。

信息:

版本信息:

  • ASP.NET 核心:3.1
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore:3.1.1
  • Microsoft.AspNetCore.Authentication.MicrosoftAccount:3.1.1
  • @角/核心:~8.1.1
  • @角/pwa:^0.803.23

编辑:

好的,当我尝试浏览我的站点地图时:https ://mintplayer.com/Sitemap我得到了相同的结果,相同的行为与以下控制台警告:

资源解释为样式表,但使用 MIME 类型 application/xml 传输:“ https://mintplayer.com/assets/sitemap.xsl ”。

4

1 回答 1

0

好的,经过一番挖掘,似乎请求的资源(在我的例子中是 /web/Account/connect/Facebook、...、/signin-facebook、...和 ​​/Sitemap)实际上是由我的服务人员缓存。我像这样更新了我的 ngsw-config.json:

{
  "$schema": "./node_modules/@angular/service-worker/config/schema.json",
  "index": "/index.html",
  "version": 6,
  "assetGroups": [
    ...
  ],
  "dataGroups": [
    {
      /* /web/... can be cached, /web/Account/... cannot */
      "name": "web",
      "urls": [ "/web", "!/web/Account" ],
      "cacheConfig": {
        "maxSize": 20,
        "maxAge": "1d",
        "strategy": "freshness"
      }
    },
    {
      /* /web/Account/... cannot be cached */
      "name": "account",
      "urls": [ "/web/Account" ],
      "cacheConfig": {
        "maxSize": 0,
        "maxAge": "0u",
        "strategy": "freshness"
      }
    },
    {
      /* /signin-** (defined by Identity) cannot be cached */
      "name": "external-callback",
      "urls": [ "/signin-microsoft", "/signin-google", "/signin-facebook", "/signin-twitter" ],
      "cacheConfig": {
        "maxSize": 0,
        "maxAge": "0u",
        "strategy": "freshness"
      }
    },
    {
      /* /Sitemap cannot be cached */
      "name": "sitemap",
      "urls": [ "/Sitemap" ],
      "cacheConfig": {
        "maxSize": 0,
        "maxAge": "0u",
        "strategy": "freshness"
      }
    }
  ],
  "cacheConfig": {
    "strategy": "freshness"
  }
}
于 2020-02-03T16:16:52.027 回答