ASP.NET Core 2:使用 [Authorize] 对 API 的 Ajax 调用使预检请求失败
Posted
技术标签:
【中文标题】ASP.NET Core 2:使用 [Authorize] 对 API 的 Ajax 调用使预检请求失败【英文标题】:ASP.NET Core 2 : Ajax calls to API with [Authorize] fail the preflight request 【发布时间】:2018-07-04 12:29:02 【问题描述】:我有一个带有 [Authorize]
属性的 API 控制器,以确保所有调用都由正确登录的用户进行(通过 OpenIdConnect,针对 Azure AD)。当我加载进行 Ajax 调用的页面时,API 会正确响应。
但是,经过一定时间后,必须重新授权用户,因此 ASP.NET Core 框架会调用 https://login.microsoftonline.com/
以重新授权用户。该调用失败并出现以下错误:
无法加载https://login.microsoftonline.com/common/oauth2/authorize?[truncated]:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'https://my.website.com' 因此不允许访问。
我尝试使用此代码配置 CORS 标头,但这并不能解决我的问题:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
// allow reconnection on API calls
app.UseCors(builder => builder
//.WithOrigins("https://login.microsoftonline.com")
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
);
app.UseMvc();
请注意,ASP.NET Core 1.0 版没有这个问题(尽管 ASP.NET MVC 5 有)。
【问题讨论】:
我不熟悉这里的细节,但确实实现了一次基于 CORS 的 SSO:CORS 请求的目标(在这种情况下为login.microsoftonline.com
)需要允许您的来源 -> 可以/您是否按照 Azure AD 端的许可输入了您的站点?
据我所知,login.microsoftonline.com
不包含 CORS 标头,我认为这不会改变..
【参考方案1】:
我找到了解决问题的方法。
我没有解决预检请求 CORS 问题。 login.microsoftonline.com
不包含 CORS 标头,所以我什至不确定它是否可以解决。
但是,我找到了一种增加 cookie 超时时间的方法,以减少重新验证用户的需要。
使用Microsoft.AspNetCore.Identity
时,有几个cookie:
IdentityConstants.ApplicationScheme
cookie
IdentityConstants.ExternalScheme
cookie
IdentityConstants.TwoFactorRememberMeScheme
cookie
IdentityConstants.TwoFactorUserIdScheme
cookie
用于 AJAX 请求的是 IdentityConstants.ExternalScheme
cookie,默认设置为 5 分钟后过期(您可以在 github 上查看默认设置)。
增加外部cookie超时时间:
services.ConfigureExternalCookie(options =>
options.ExpireTimeSpan = TimeSpan.FromDays(14);
);
【讨论】:
以上是关于ASP.NET Core 2:使用 [Authorize] 对 API 的 Ajax 调用使预检请求失败的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 入门教程 1使用ASP.NET Core 构建第一个Web应用
ASP.NET Core 2:如何使用区域 RedirectToPage?
如何使用 Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core Identity 手动散列密码
ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门