【问题标题】:How do I avoid CORS problem when using OpenID Connect (AWS Cognito)?使用 OpenID Connect (AWS Cognito) 时如何避免 CORS 问题?
【发布时间】:2019-11-10 07:00:04
【问题描述】:

我正在使用 Vue.js 和 .net 核心 Web API 设置网页。前端和后端完全分开。

我已将我的 API 配置为使用 openid connect 和 AWS Cognito 中的“授权代码授予”进行身份验证,如下所示:

services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddCookie()
        .AddOpenIdConnect(options =>
        {
            options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.ResponseType = OpenIdConnectResponseType.Code;
            options.MetadataAddress = cognitoSettings.AuthorityUrl;
            options.ClientId = cognitoSettings.ClientId;
            options.SaveTokens = false;
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true
            };
        });

当我从 [Authorized] 控制器请求数据时,这在浏览器中运行良好,我被重定向到 Cognito 登录页面,输入凭据后,我可以看到授权数据。

但是,如果我在 Vue-App 中使用 ajax(axios) 请求相同的资源,后端会返回 302,并且由于跨域策略,ajax 调用会失败。 (因为 Cognito 登录与我的后端位于不同的域中)

所以我的问题是:我怎样才能让这个场景发挥作用?

  • 我是否需要将 openid 身份验证移动到我的前端 完成这项工作并让后端仅使用 Bearer 令牌 授权?但是我需要所有的 openid 信息,比如名字或 电子邮件地址在后端,而不是在我的 Vue-App 中。那我怎样才能得到它们呢?

  • 是否可以将响应代码从 302 更改为 401 所以 前端可以对未经授权的呼叫做出反应并重定向用户? 但是我从哪里获取登录 URL,因为所有配置(client_id,元数据地址)都是 在我的后端配置。

【问题讨论】:

  • “是否可以将响应码从 302 改为 401,以便前端可以对未经授权的调用做出反应并重定向用户” - CORS 与身份验证:关键在于,如果来自不允许的域,即使经过身份验证的请求也会被拒绝。不熟悉 cognito,但 this question 建议可以为它启用 CORS - 可能来自 here
  • 我知道 CORS 与身份验证无关,但在这种情况下 Cognito 身份提供者正在托管登录页面。如果用户未通过身份验证,我的后端将重定向到此页面。所以 Cognito 必须在这里返回 CORS 标头,但我还没有找到这样做的方法。事实上,我的 c# API 已经返回 CORS 标头以允许我的 Vue-App。链接的问题似乎更多地针对 CORS 的安全问题。

标签: c# vue.js single-page-application amazon-cognito openid-connect


【解决方案1】:

给你一些建议: * 你的 API 不应该使用 openid 连接 - 它应该只验证访问令牌 * 您的 SPA 应使用 Javascript 库实现 Open Id Connect

我的博客上有一个带有此架构的 Cognito 示例 UI - 您可以登录 - 请参阅此链接: https://authguidance.com/home/code-samples-quickstart/

博客上有一些相关的文章和代码示例 - 可能会看到第一个 SPA 示例和 .Net Core 示例

【讨论】:

  • 是的,这让我花了一段时间才明白。这就是我现在实现的方式。
  • @simon 我有完全相同的设置并遇到了同样的问题。您能否分享一下为了避免 302 而必须更改的内容?
猜你喜欢
  • 2019-01-17
  • 2018-05-08
  • 2018-06-16
  • 2018-05-15
  • 2022-01-16
  • 2017-11-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多