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”部分:<section name="anonymousAuthentication" overrideModeDefault="Allow" />
。 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 6框架揭秘》实例演示[10]:Options基本编程模式