如何使用具有BASIC身份验证的服务工作者(NTLM,协商)

时间:2016-07-04 23:09:29

标签: ntlm service-worker http-negotiate

我一直在尝试使用IIS托管网站中的服务工作者来缓存网站的一些静态内容。该站点是使用Windows身份验证的内部应用程序。我已经能够在没有太多麻烦的情况下注册和运行服务工作者,但是只要我打开缓存并开始向缓存添加文件,承诺就会因授权失败而失败。返回的HTTP结果是401 Unauthorized。在浏览器和服务器能够协商授权之前,这是对前几个请求的通常响应。

我会尽快发布一些有助于解释的代码。

修改

var staticCacheName = 'app-static-v1';
console.log("I AM ALIVE");
this.addEventListener('install', function (event) {
    console.log("AND I INSTALLED!!!!");
    var urlsToCache = [
        //...many js files to cache
        '/scripts/numeral.min.js?version=2.2.0',
        '/scripts/require.js',
        '/scripts/text.js?version=2.2.0',
        '/scripts/toastr.min.js?version=2.2.0',
    ];


    event.waitUntil(
        caches.open(staticCacheName).then(function (cache) {
            cache.addAll(urlsToCache);
        }).catch(function (error) {
            console.log(error);
        })
    );
});

1 个答案:

答案 0 :(得分:17)

这只是一个猜测,因为缺少代码,但如果你正在做类似的事情:

caches.open('my-cache').then(cache => {
  return cache.add('page1.html'); // Or caches.addAll(['page1.html, page2.html']);
});

您正在利用隐含的Request object creation(参见第6.4.4.4.1节),当您将字符串传递给cache.add() / cache.addAll()时。创建的Request对象使用默认credentials mode,即'omit'

您可以做的是明确构建一个包含您更喜欢的凭据模式的Request对象,在您的情况下可能是'same-origin'

caches.open('my-cache').then(cache => {
  return cache.add(new Request('page1.html', {credentials: 'same-origin'}));
});

如果你有一堆网址要将数组传递给cache.addAll(),你可以.map()将它们传送到Request的相应数组:

var urls = ['page1.html', 'page2.html'];
caches.open('my-cache').then(cache => {
  return cache.addAll(urls.map(url => new Request(url, {credentials: 'same-origin'})));
});