ASP.NET Core:带有 OPTIONS 异常的 Windows 身份验证(CORS 预检)

Posted

技术标签:

【中文标题】ASP.NET Core:带有 OPTIONS 异常的 Windows 身份验证(CORS 预检)【英文标题】:ASP.NET Core: Windows Authentication with OPTIONS exception (CORS preflight) 【发布时间】:2020-08-11 23:23:39 【问题描述】:

我正在开发一个单页 Web 应用程序。它有 ASP.NET Core 3 后端和 Angular 9 前端。我在 IIS Express 上的 Visual Studio 中运行后端 http://localhost:59280。前端在 Visual Studio Code 中运行,使用 ng serve,http://localhost:4200。之前我不需要在后端开启 CORS,因为我只在 Chrome 中测试了应用程序,添加--disable-web-security 命令行参数就足以关闭同源策略。在live server上不需要CORS,上面的跨域情况只发生在我的dev机器上。

现在我想在 Firefox 中调试前端,但由于无法关闭 Firefox 的同源策略,我必须在后端打开 CORS。不幸的是,它不起作用,因为我使用 Windows 身份验证,它会停止默认未经身份验证的CORS preflight request。如果我可以在没有 Windows 身份验证的情况下处理 HTTP OPTIONS 请求,这可以解决。我认为这可以通过向 web.config 添加类似的内容来完成:

<system.webServer>
  <security>
    <authentication>
      <anonymousAuthentication enabled="true" />
    </authentication>
    <authorization>
      <add accessType="Allow" verbs="OPTIONS" users="*" />
    </authorization>
  </security>
</system.webServer>

...但是我收到一条错误消息:“此配置部分不能在此路径中使用。当该部分被锁定在父级别时会发生这种情况。”显然 web.config 与 launchSettings.json 冲突,当后端在 Visual Studio 的 IIS Express 上运行时,它似乎控制身份验证,使用这两行:


  "iisSettings": 
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    ...

我不知道如何仅使用 launchSettings.json 为 HTTP OPTIONS 请求单独关闭 Windows 身份验证。

有没有办法在 ASP.NET Core 3 应用程序中为 HTTP OPTIONS 请求单独关闭 Windows 身份验证?

【问题讨论】:

您可以尝试将 app.UserCors 放在 app.UseAuthentication 之前,并添加一个中间件,在出现选项时立即返回:***.com/a/31754050/1882699 UserCors 来对地方了。我尝试了中间件的想法,现在 OPTIONS 请求返回 200 OK,而不是 401 Unauthorized。但这没有帮助,因为 POST 不是在 OPTIONS 之后发送的... 嗯...如果我返回 204 No Content 和上面 MDN 页面中列出的标题(Access-Control-Allow-Methods: POST 等)然后发送 POST,但得到 401 Unauthorized .至少这是真正的进步,谢谢! 这能回答你的问题吗? How to authorize CORS preflight request on IIS with Windows Authentication 【参考方案1】:

1) 上述 web.config 设置有效,我只需要解锁 .vs 目录中 applicationhost.config 中的“anonymousAuthentication”部分:&lt;section name="anonymousAuthentication" overrideModeDefault="Allow" /&gt;。 launchSettings.json 中“anonymousAuthentication”参数的值无关紧要。

2) 按照@MartinStaufcik 的建议,我在 StartUp.Configure() 的开头添加了一个中间件,用于响应预检请求 (MDN):

app.Use(async (context, next) => 
  if (context.Request.Method == "OPTIONS") 
    context.Response.StatusCode = 204;
    context.Response.Headers.Add("Access-Control-Allow-Origin", context.Request.Headers["Origin"]);
    context.Response.Headers.Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    return;
  
  await next();
);

3) 我还必须在 Angular 9 前端的 HttpClient.post() 的参数中添加 withCredentials: true 。没有这个,OPTIONS 请求得到 204,但随后的 POST 得到 401。

【讨论】:

以上是关于ASP.NET Core:带有 OPTIONS 异常的 Windows 身份验证(CORS 预检)的主要内容,如果未能解决你的问题,请参考以下文章

仅 xamarin 表单应用程序的 Asp.net Core 授权失败

ASP.NET Core-几个Options的简单使用

《ASP.NET Core 6框架揭秘》实例演示[10]:Options基本编程模式

如何在 asp.net core razor 页面中拒绝匿名用户?

ASP.Net Core Cookie 身份验证

更改 ASP.NET Core Razor 页面中的默认登录页面?