不处理 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 预检请求的主要内容,如果未能解决你的问题,请参考以下文章

预检请求处理程序 arc.codes

如何在 django 的预检 CORS POST 请求中处理 CSRF?

如何在 SiteMinder 受保护的环境中处理 CORS 预检请求?

处理对 ASP.NET MVC 操作的 CORS 预检请求

Ajax 不接受 CORS(预检)响应

如何使用 Gorilla 处理 DELETE 调用的预检请求?