angular-cli: proxyConfig with Windows authentication stopped working after update to 8

🐞 Bug report

Command (mark with an x)

- [ ] new
- [ ] build
- [X] serve
- [ ] test
- [ ] e2e
- [ ] generate
- [ ] add
- [ ] update
- [ ] lint
- [ ] xi18n
- [ ] run
- [ ] config
- [ ] help
- [ ] version
- [ ] doc

Is this a regression?

Yes, the previous version in which this bug was not present was: 7.1.4

Description

When using ng serve with a proxy config to forward all api calls to a .net api hosted on local IIS with windows authentication the browser constantly displays the login dialog.

πŸ”¬ Minimal Reproduction

Create project in ng7 and forward all api calls to IIS with windows authentication using config below, works fine. Update to 8 and authentication fails.


module.exports = {
    '/api/*': {
        target: "http://localhost/api/",
        secure: false,
        logLevel: "debug",
        changeOrigin: true,
        agent: new Agent({
            maxSockets: 100,
            keepAlive: true,
            maxFreeSockets: 10,
            freeSocketTimeout: 30000,
            timeout: 60000,
            keepAliveMsecs: 300000,
            
        }),
        onProxyRes: proxyRes => {
            let key = 'www-authenticate';
            proxyRes.headers[key] = proxyRes.headers[key] && proxyRes.headers[key].split(',');
        }
    }
};

πŸ”₯ Exception or Error





🌍 Your Environment

Failing environment:


Angular CLI: 8.0.0
Node: 12.3.1
OS: win32 x64
Angular: 8.0.0
... animations, cli, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.800.0
@angular-devkit/build-angular     0.800.0
@angular-devkit/build-optimizer   0.800.0
@angular-devkit/build-webpack     0.800.0
@angular-devkit/core              8.0.0
@angular-devkit/schematics        8.0.0
@angular/cdk                      7.2.0
@ngtools/webpack                  8.0.0
@schematics/angular               8.0.0
@schematics/update                0.800.0
rxjs                              6.5.2
typescript                        3.4.5
webpack                           4.30.0

Working environment:


Angular CLI: 7.1.4
Node: 12.3.1
OS: win32 x64
Angular: 7.1.4
... animations, cli, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.11.4
@angular-devkit/build-angular     0.11.4
@angular-devkit/build-optimizer   0.11.4
@angular-devkit/build-webpack     0.11.4
@angular-devkit/core              7.1.4
@angular-devkit/schematics        7.1.4
@ngtools/webpack                  7.1.4
@schematics/angular               7.1.4
@schematics/update                0.11.4
rxjs                              6.3.3
typescript                        3.1.6
webpack                           4.23.1

Anything else relevant?

Updated weback-dev-server to 3.3.1 and agentkeepalaive to 4.0.2 to match ng 8.0 in 7.1.4, everything still works in 7.1.4

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 7
  • Comments: 22

Commits related to this issue

Most upvoted comments

Same issue here. IE works fine while Chrome doesn’t work.

πŸ˜ƒ I have found a temporary work around until the Angular team comes up with a patch.

From your Angular project directory, edit the file: node_modules\@angular-devkit\build-webpack\src\webpack-dev-server\index.js

Comment out the following as shown below:

function runWebpackDevServer(config, context, options = {}) {
    const createWebpack = options.webpackFactory || (config => rxjs_1.of(webpack(config)));
    const log = options.logging
        || ((stats, config) => context.logger.info(stats.toString(config.stats)));
    /*config = webpackMerge(config, {
        plugins: [
            new architect_2.ArchitectPlugin(context),
        ],
    });//*/
    const devServerConfig = options.devServerConfig || config.devServer || {};
    if (devServerConfig.stats) {
        config.stats = devServerConfig.stats;
    }

In summary - just before running the webpack dev-server Angular injects a dev-server plugin called ArchitectPlugin. Why this plugin causes new proxy sockets to be opened rather than reused - I haven’t a clue.

@alan-agius4 - can you assign this to a dev who knows the ArchitectPlugin?

@VAchris Great job, Chris. Thank you for finding the fix. It was stopping me from moving to 8.

I did further testing using different browsers. While Google Chrome and Firefox(with negotiate and ntlm configured) are having a similar behavior (endless password prompt), Internet Explorer is working (at least after an initial password prompt) Some logs below : Google Chrome

[HPM] Proxy created: /api  ->  http://localhost:33678
[HPM] Subscribed to http-proxy events:  [ 'error', 'proxyRes', 'close' ]
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate, NTLM"
www-authenticate ["Negotiate"," NTLM"]
End onProxyRes
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate oYIBFzCCAROgAwoBAaEMBgorBgEEAYI3AgIKooH9BIH6TlRMTVNTUAACAAAAEAAQADgAAAAVwoniaJ+5X4riz4R7AAEAAAAAALIAsgBIAAAACgBjRQAAAA9BAEQALQBTAFcASQBTAFMAAgAQAEEARAAtAFMAVwBJAFMAUwABABoAUwBXAEkAUwBTAC0AUwBJAEUARwAtADEANAAEABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0AAwA0AFMAVwBJAFMAUwAtAFMASQBFAEcALQAxADQALgBhAGQALgBzAHcAaQBzAHMALgBjAG8AbQAFABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0ABwAIAKn4ewtgJ9UBAAAAAA=="
www-authenticate ["Negotiate oYIBFzCCAROgAwoBAaEMBgorBgEEAYI3AgIKooH9BIH6TlRMTVNTUAACAAAAEAAQADgAAAAVwoniaJ+5X4riz4R7AAEAAAAAALIAsgBIAAAACgBjRQAAAA9BAEQALQBTAFcASQBTAFMAAgAQAEEARAAtAFMAVwBJAFMAUwABABoAUwBXAEkAUwBTAC0AUwBJAEUARwAtADEANAAEABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0AAwA0AFMAVwBJAFMAUwAtAFMASQBFAEcALQAxADQALgBhAGQALgBzAHcAaQBzAHMALgBjAG8AbQAFABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0ABwAIAKn4ewtgJ9UBAAAAAA=="]
End onProxyRes
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate, NTLM"
www-authenticate ["Negotiate"," NTLM"]
End onProxyRes

## At this point the password prompt appears, the user types its credentials

[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate TlRMTVNTUAACAAAAEAAQADgAAAAVgoniWyfcF0P3PWkAAAAAAAAAALIAsgBIAAAACgBjRQAAAA9BAEQALQBTAFcASQBTAFMAAgAQAEEARAAtAFMAVwBJAFMAUwABABoAUwBXAEkAUwBTAC0AUwBJAEUARwAtADEANAAEABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0AAwA0AFMAVwBJAFMAUwAtAFMASQBFAEcALQAxADQALgBhAGQALgBzAHcAaQBzAHMALgBjAG8AbQAFABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0ABwAIALMV/hpgJ9UBAAAAAA=="
www-authenticate ["Negotiate TlRMTVNTUAACAAAAEAAQADgAAAAVgoniWyfcF0P3PWkAAAAAAAAAALIAsgBIAAAACgBjRQAAAA9BAEQALQBTAFcASQBTAFMAAgAQAEEARAAtAFMAVwBJAFMAUwABABoAUwBXAEkAUwBTAC0AUwBJAEUARwAtADEANAAEABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0AAwA0AFMAVwBJAFMAUwAtAFMASQBFAEcALQAxADQALgBhAGQALgBzAHcAaQBzAHMALgBjAG8AbQAFABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0ABwAIALMV/hpgJ9UBAAAAAA=="]
End onProxyRes
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate, NTLM"
www-authenticate ["Negotiate"," NTLM"]
End onProxyRes

Internet Explorer

[HPM] Proxy created: /api  ->  http://localhost:33678
[HPM] Subscribed to http-proxy events:  [ 'error', 'proxyRes', 'close' ]
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate, NTLM"
www-authenticate ["Negotiate"," NTLM"]
End onProxyRes
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate oYIBFzCCAROgAwoBAaEMBgorBgEEAYI3AgIKooH9BIH6TlRMTVNTUAACAAAAEAAQADgAAAAVwoniJ8/i+M3zH0lpAAEAAAAAALIAsgBIAAAACgBjRQAAAA9BAEQALQBTAFcASQBTAFMAAgAQAEEARAAtAFMAVwBJAFMAUwABABoAUwBXAEkAUwBTAC0AUwBJAEUARwAtADEANAAEABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0AAwA0AFMAVwBJAFMAUwAtAFMASQBFAEcALQAxADQALgBhAGQALgBzAHcAaQBzAHMALgBjAG8AbQAFABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0ABwAIAN4QYORWJ9UBAAAAAA=="
www-authenticate ["Negotiate oYIBFzCCAROgAwoBAaEMBgorBgEEAYI3AgIKooH9BIH6TlRMTVNTUAACAAAAEAAQADgAAAAVwoniJ8/i+M3zH0lpAAEAAAAAALIAsgBIAAAACgBjRQAAAA9BAEQALQBTAFcASQBTAFMAAgAQAEEARAAtAFMAVwBJAFMAUwABABoAUwBXAEkAUwBTAC0AUwBJAEUARwAtADEANAAEABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0AAwA0AFMAVwBJAFMAUwAtAFMASQBFAEcALQAxADQALgBhAGQALgBzAHcAaQBzAHMALgBjAG8AbQAFABgAYQBkAC4AcwB3AGkAcwBzAC4AYwBvAG0ABwAIAN4QYORWJ9UBAAAAAA=="]
End onProxyRes
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate, NTLM"
www-authenticate ["Negotiate"," NTLM"]
End onProxyRes

## At this point the password prompt appears, the user types its credentials

[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARuyivBH37Wpp+3dmyMTQxiCyVljCHDv/hzWgDixoj6bfiNHtm9n3shtiqNjBSyid3AH13JbxMPR4P2/lOf19i5KdKkb+cwyvAu9nE73WXtNe7OzJfwU2n74Vj7b0xdVGMD41a9pBBG8opGmL2DbKk="
www-authenticate ["Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARuyivBH37Wpp+3dmyMTQxiCyVljCHDv/hzWgDixoj6bfiNHtm9n3shtiqNjBSyid3AH13JbxMPR4P2/lOf19i5KdKkb+cwyvAu9nE73WXtNe7OzJfwU2n74Vj7b0xdVGMD41a9pBBG8opGmL2DbKk="]
End onProxyRes
[HPM] GET /api/core/businessAreas/user -> http://localhost:33678
Begin onProxyRes
www-authenticate "Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARuZWc6Q05giVBMb2rV72A3KNWiWB4G91zIkqqM5uaZz3gIe1VL1aWC0DdZu5HuS9ZnMvTnEv5hTeYWWD6ph0JryStHjZjak6mcBOVycnQWMJXh19d8cHYA0F9TcEvBy2a9xC6pmBdPC9amgnxuVzE="
www-authenticate ["Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARuZWc6Q05giVBMb2rV72A3KNWiWB4G91zIkqqM5uaZz3gIe1VL1aWC0DdZu5HuS9ZnMvTnEv5hTeYWWD6ph0JryStHjZjak6mcBOVycnQWMJXh19d8cHYA0F9TcEvBy2a9xC6pmBdPC9amgnxuVzE="]
End onProxyRes

Hello,

I’m experiencing the same problem after updating my 7.2.x app to 8.

Angular CLI: 8.0.3
Node: 12.4.0
OS: win32 x64
Angular: 8.0.1
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router, service-worker

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.800.3
@angular-devkit/build-angular     0.800.3
@angular-devkit/build-optimizer   0.800.3
@angular-devkit/build-webpack     0.800.3
@angular-devkit/core              7.3.9
@angular-devkit/schematics        7.3.9
@angular/cli                      8.0.3
@angular/pwa                      0.13.9
@ngtools/webpack                  8.0.3
@schematics/angular               7.3.9
@schematics/update                0.800.3
rxjs                              6.5.2
typescript                        3.4.5
webpack                           4.30.0

Application is started using

ng serve --proxy-config proxy.conf.js

The proxy configuration file is similar to the one posted by LukeDi The first call to the proxied API pops up the basic authentication dialog. It looks like the credentials are never passed to the proxied environment.

Looks like the credentials are not transferred to the proxied environment