【发布时间】: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