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

时间:2019-06-28 10:01:24

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

我正在使用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
            };
        });

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

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

所以我的问题是:如何使这种情况起作用?

  • 我需要将openid身份验证移动到前端吗    使这项工作并使后端仅将Bearer令牌用于    授权?但是然后我需要所有openid信息,例如name或    email-address在后端而不在我的Vue-App中。那我怎么得到他们?

  • 是否可以将响应代码从302更改为401    前端可以响应未经授权的呼叫并重定向用户?    但是我从哪里得到登录URL,因为所有配置(client_id,metadataaddress)都是    在我的后端中配置。

1 个答案:

答案 0 :(得分:0)

一些适合您的指标: *您的API不应使用openid connect-它应仅验证访问令牌 *您的SPA应该使用Javascript库实现Open Id Connect

我的博客上有一个具有此体系结构的Cognito示例用户界面-您可以登录-看到此链接: https://authguidance.com/home/code-samples-quickstart/

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