【问题标题】:ASP.NET Core 2 : Ajax calls to API with [Authorize] fail the preflight requestASP.NET Core 2:使用 [Authorize] 对 API 的 Ajax 调用使预检请求失败
【发布时间】: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 标头,我认为这不会改变..

标签: c# cors asp.net-core-mvc asp.net-core-2.0


【解决方案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);
});

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2018-03-24
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多