【问题标题】:CORS PreFlight not sending Credentials, Server wants to deny unauthenticated usersCORS PreFlight 未发送凭据,服务器想要拒绝未经身份验证的用户
【发布时间】:2016-12-30 18:29:42
【问题描述】:

场景

IIS 网络服务器。 不是 .Net Web 服务。 发布到 Web 服务。

.Net web应用以跨域方式连接到Webservice。

要求

网络服务器需要经过身份验证的 Active Directory 用户才能进行单点登录。

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

我在哪里:

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

问题:

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

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

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

偏好:

对于解决方案路径 (a),我可以满足它的要求。

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

想法?

【问题讨论】:

    标签: cors preflight


    【解决方案1】:

    引用问题中的要求:

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

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

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

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

    1. 设preflight是一个新的request,其methodOPTIONSurl是请求的当前url,initiator是请求的发起者, type 是请求的类型,destination 是请求的目的地,origin 是请求的来源,referrer 是请求的引用者,referrer policy 是请求的referrer 政策。

    每个request 还带有一个credentials mode

    请求具有关联的凭据模式,即“omit”、“same-origin”或“include”。除非另有说明,否则为“omit”。

    由于上述 CORS 预检算法的第一步未指定 OPTIONS 请求的凭据模式的值,因此浏览器必须对这些请求使用默认的“omit”。

    鉴于此,您将无法在客户端(浏览器)端找到解决此问题的任何方法,因此我猜您需要在服务器端进行修复。

    【讨论】:

    • 谢谢。我读过的一些 CORS 文章说,“默认”选项请求中没有发送凭据,这意味着可以发送它们。有没有办法将 IIS 配置为仅接受匿名选项请求但要求其他任何凭据?我们发现让选项起作用的唯一方法就是完全停止在帖子上发送凭据。
    • 对不起,我对配置 IIS 一无所知。我回答只是明确表示无法从客户端解决此问题。
    • Chrome 在预检 OPTIONS 请求中发送凭据。
    【解决方案2】:

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

    如果您受到 CORS 的打击,而您只是尝试做一个 Intranet 应用程序,那么有一种方法可以关闭 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.)
    

    您需要执行设置策略的系统管理员任务,确保它到达本地盒子等。我对详细信息不够了解,无法编写该部分。对不起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多