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 入门

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 25. 过滤器

ASP.NET Core 2.0中的HttpContext