代码之家  ›  专栏  ›  技术社区  ›  Ogglas

webpack dev server使用Windows身份验证(NTLM身份验证)热重新加载代理IIS Express

  •  2
  • Ogglas  · 技术社区  · 7 年前

    我创建了一个新的 ASP.NET Web Application -&燃气轮机;具有Windows身份验证的Web API 2项目。这在IIS Express中工作得很好,但为了让我的React前端重新加载,我尝试使用 webpack-dev-server 并让它代理我的IIS Express。我以前在cookie身份验证和令牌(承载)身份验证中都使用过这种方法,没有问题,但在Windows身份验证(NTLM身份验证)中,它不起作用。

    查看服务器的响应,我得到了预期的 401 Unauthorized (401.2) 标题响应 www-authenticate: Negotiate, NTLM 正如预期的那样,但我认为客户端不会使用 Authorization: NTLM .

    我尝试过的浏览器(Chrome、Firefox和IE)也不会正常提示我输入正确的凭据。

    https://blogs.msdn.microsoft.com/chiranth/2013/09/20/ntlm-want-to-know-how-it-works/

    我的网页设置。配置。js如下所示:

    var proxy = 'localhost:57263';
    
    devServer: {
        proxy: {
            '*': {
                target: 'http://' + proxy,
                changeOrigin: true,
            },
            port: 8080,
            host: '0.0.0.0',
            hot: true,
        },
    }
    
    1 回复  |  直到 7 年前
        1
  •  8
  •   Ogglas    7 年前

    查看文档后 webpack-dev-server Proxy 我看到他们使用 http-proxy-middleware .

    https://webpack.github.io/docs/webpack-dev-server.html#proxy

    这让我找到了这条线索并回答:

    https://github.com/chimurai/http-proxy-middleware/issues/39#issuecomment-330911943

    最终解决方案:

    运行时间:

    npm install agentkeepalive --save
    

    工作代码:

    var proxy = 'localhost:57263';
    
    devServer: {
        proxy: {
            '*': {
                target: 'http://' + proxy,
                changeOrigin: true,
                agent: new agent({
                    maxSockets: 100,
                    keepAlive: true,
                    maxFreeSockets: 10,
                    keepAliveMsecs: 100000,
                    timeout: 6000000,
                    keepAliveTimeout: 90000 // free socket keepalive for 90 seconds
                }),
                onProxyRes: (proxyRes) => {
                    var key = 'www-authenticate';
                    proxyRes.headers[key] = proxyRes.headers[key] && proxyRes.headers[key].split(',');
                },
            },
            port: 8080,
            host: '0.0.0.0',
            hot: true,
        },
    }