c# - 使用 OpenID Connect (AWS Cognito) 时如何避免 CORS 问题?

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

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

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

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
            };
        });

当我从[授权] Controller 请求数据时,这在浏览器中工作正常,我被重定向到 Cognito 登录页面,并且在输入凭据后,我可以看到授权数据。

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

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

  • 我需要将 openid 身份验证移至我的前端吗 使这项工作有效并让后端仅使用不记名 token 授权?但随后我需要所有 openid 信息,例如姓名或 电子邮件地址位于后端而不是我的 Vue 应用程序中。那我怎样才能得到它们呢?

  • 是否可以将响应代码从 302 更改为 401 前端可以对未经授权的调用使用react并重定向用户吗? 但是我从哪里获取登录 URL,因为所有配置(client_id、metadataaddress)都是 在我的后端配置。

最佳答案

给您一些提示: * 你的 API 不应该使用 openid connect - 它应该只验证访问 token * 您的 SPA 应使用 Javascript 库实现 Open Id Connect

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

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

关于c# - 使用 OpenID Connect (AWS Cognito) 时如何避免 CORS 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56804862/

相关文章:

javascript - Vuejs : How to implement popover for each dropdown-items

javascript - 如何将 Bulma 页面加载器扩展添加为 Vue 组件?

javascript - 使用 next.js 进行服务器端渲染与传统 SSR

reactjs - 从 Phoenix 后端拆分单页应用程序代码?

c# - 奥尔良用极简的用例慢

c# - 为什么 Bitmap.FromFile() 返回 Image 类型的对象

c# - PDFLib set_graphics_option 如何在 fillcolor 选项中传递颜色列表

c# - 通过 LINQ 将表达式树应用于 List

javascript - vuejs 根据 promise 更新模板中的值

javascript - this._delegate.setNgStyle 不是 Angular 8 更新后的函数