CORS PreFlight不发送凭据,服务器想要拒绝未经身份验证的用户

时间:2016-08-23 19:41:45

标签: cors preflight

方案

IIS Webserver。 不是.Net Webservice。 发布到Webservice。

.Net网络应用程序以跨域方式连接到Webservice。

要求

Webserver需要通过单点登录来验证经过身份验证的Active Directory用户。

飞行前OPTIONS测试接受经过身份验证的请求是可以接受的,但任何其他请求(包括OPTIONS测试后的POST)都必须要求经过身份验证的用户。

我在哪里:

我在Web应用程序和Web服务器之间进行了成功的CORS跨域调用。我可以清楚地看到OPTIONS调用工作,然后后续POST调用工作。

问题:

OPTIONS调用不会发送凭据。为了解决这个问题,我们允许网站级别的匿名用户。否则,我们会收到401 Unauthorized错误。

但是,一旦我们这样做,POST不再需要身份验证。实际上,Web服务器日志显示根本不在帖子中发送凭据。这是不可接受的。

我需要一种方法来(a)强制OPTIONS调用发送Active Directory凭据,或者(b)网络服务器必须拒绝所有未经身份验证的非OPTIONS请求。

设定:

对于解决方案路径(a),我可以根据需要进行游戏。

对于解决方案路径(b),更喜欢IIS设置或web.config设置。 Web服务器是用python编写的,但我想我们可以创建一个c#webserver代码单元来调用在服务器上真正工作的python代码。

想法?

2 个答案:

答案 0 :(得分:1)

引用问题中的要求:

  

我需要一种方法来(a)强制OPTIONS调用发送Active Directory凭据,或者(b)网络服务器必须拒绝所有未经通知的非OPTIONS请求。

无法强制浏览器在OPTIONS调用中发送凭据。浏览器需要在所有OPTIONS预检请求中省略凭据。

请参阅Fetch规范的CORS-preflight fetch部分中的算法的第一步,该部分说明:

  

要使用请求执行CORS预检获取,请执行以下步骤:

     
      
  1. 让预检成为新的request,其方法OPTIONS url 是请求的当前网址,发起人是请求的发起方,类型是请求的类型,目标是请求的目标,来源是请求的来源,推荐人是请求的推荐人,而推荐人政策是请求的推荐人政策。
  2.   

每个request也带有credentials mode

  

请求具有关联的凭据模式,即" omit"," same-origin"或者& #34; include&#34 ;.除非另有说明,否则它是" omit"。

由于上面引用的CORS预检算法的第一步没有为OPTIONS请求的凭据模式指定任何值,因此浏览器必须使用默认的" omit"对于那些要求。

鉴于此,你不会在客户端(浏览器)方面找到任何解决方法,所以我猜你需要在服务器端修复它。

答案 1 :(得分:0)

这不是我要求的答案,但这是一个可以解决一些人的问题的答案。

如果您受到CORS的打击,并且您只是尝试进行内部网应用程序,则可以关闭CORS。

可以设置组策略。

Computer Configuration 
-> Administrative Templates 
   -> Windows Components
      -> Internet Explorer
         -> Internet Control Panel
            -> Security Page
               -> Intranet Zone  (and/or Trusted Sites Zone, depending)
                  -> Access data sources across domains  
                        (set to Enabled.)

您需要执行设置策略的sys管理任务,确保它到达本地框等等。我对于编写该部分的细节不够精明。遗憾。