不处理 OWIN 预检请求
Posted
技术标签:
【中文标题】不处理 OWIN 预检请求【英文标题】:OWIN preflight requests are not processed 【发布时间】:2017-06-25 13:47:39 【问题描述】:中间件不处理从浏览器到我的自托管 OWIN WebAPI 的所有预检请求。如果我向邮递员发出 OPTIONS 请求,它们就会被处理。为什么会有这样的行为?
请求 网址:http://localhost:9000/api/v1/conversations/create?connectionId=13509f44-eacb-4950-8cc8-71bd37098975
请求方法:OPTIONS
状态码:401 未经授权的遥控器
地址:[::1]:9000
接受:/
接受编码:gzip、deflate、sdch、br
接受语言:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
访问控制请求标头:内容类型
访问控制请求方法:POST
连接:保持活动状态
主机:本地主机:9000
来源:http://localhost:8080
推荐人:http://localhost:8080/
用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Chrome 的响应标头:
内容长度:0
日期:格林威治标准时间 2017 年 2 月 8 日星期三 04:17:26
服务器:Microsoft-HTTPAPI/2.0
WWW-身份验证:NTLM
Postman 的响应标头:
Access-Control-Allow-Credentials →true
Access-Control-Allow-Origin →chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
允许 →POST
内容长度 →76
内容类型→应用程序/json;字符集=utf-8
日期 →2017 年 2 月 8 日星期三 04:21:02 GMT
服务器→Microsoft-HTTPAPI/2.0
我在我的 appbuilder 中添加了假中间件:
public void BuildWebApi(IAppBuilder appBuilder)
appBuilder.Use(async (ctx, next) =>
await next();
);
并将断点放在“等待下一个()”行。所以断点不会在浏览器发出预检请求时停止,而在邮递员 OPTIONS 响应时停止。
【问题讨论】:
***.com/questions/24989769/… 和 ***.com/questions/20079813/… 可能是相关的。如果您还在问题中包含请求标头,它也可能会有所帮助。 UseCors 不起作用,因为它还在后台添加了不会在来自 Chrome 的预检请求中调用的中间件。当然我已经添加了 UserCors() 和 config.EnableCors() 但它没有效果。 好的,所以***.com/questions/20079813/… 对你没有帮助? 不,因为自托管,我没有任何 xml 配置。我已将请求标头添加到问题中。 请阅读***.com/questions/20079813/…的答案。它不使用任何 XML 配置。相反,它涉及:(1) 安装Microsoft.AspNet.WebApi.Cors
nuget 包、Microsoft.Owin.Cors
nuget 包,然后 (2) 在 Startup.cs
文件中的 WebApiConfig.Register(config)
行上方添加 config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE"))
,然后 (3) 添加 @ 987654334@ 到Startup.Auth.cs
文件。没有 XML 配置。
【参考方案1】:
解决了这个问题
HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemeSelectorDelegate = request =>
if (request.HttpMethod == "OPTIONS")
return AuthenticationSchemes.Anonymous;
;
【讨论】:
以上是关于不处理 OWIN 预检请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django 的预检 CORS POST 请求中处理 CSRF?