有没有一种方法可以检查 Windows 身份验证(协商、Kerberos、NTLM...)在浏览器中是否可用(使用 JavaScript 或其他方法),如果不可用,浏览器不会提示输入用户名和密码?
背景
我们正在开发 Angular2 SPA 企业应用程序,如果可用(用户正在从加入域的计算机访问应用程序),我们希望使用 Windows 身份验证进行 SSO,如果不可用,则优雅地故障转移到基于表单的身份验证(从Internet 或未加入域的计算机)。
设置
在服务器端有一个受 Windows 身份验证保护的资源(即 REST 方法)。当您使用 JavaScript 调用此 REST 方法时,将发生以下两种情况之一:
- 如果 Windows 身份验证可用,将调用方法,您将收到 200 OK 响应
- 如果 Windows 身份验证不可用,将返回 401 Unathorized 并将 WWW-Authenticate header 设置为协商,这将导致浏览器(至少 IE,未在其他浏览器中测试,但无论使用何种浏览器都需要能够检测到这一点) 显示登录提示
问题
不希望显示登录提示,我们希望优雅地退回到基于表单的登录。
一些 solutions建议从响应中删除 WWW-Authenticate header ,但这将阻止 Windows 身份验证工作,因为此步骤是 broser-server 协商身份验证协议(protocol)的一部分。如果删除,浏览器将永远不会发送 NTLM 或 Kerberos token 。
我们同时控制前端和后端,因此可以修改任何一个以使其工作。此外,没有 CORS,一切都是来自单个域的服务器。
任何能够从客户端检测 Windows 身份验证是否可用的方法对我们来说都足够了。到目前为止我发现的是 this但它仅适用于 IE,并且需要启用 ActiveX。 This问题有点相关,但它也没有解决方案,而且已经很老了。
最佳答案
我们在 Web Worker 中使用 XmlHttpRequest。 这样就可以执行 Kerberos 身份验证,而不会在失败时触发登录窗口。
IE11 支持 Web Workers,所以你应该可以很好地使用它。
这涉及证明单个 API 端点,您可以在其中尝试通过 Kerberos 进行身份验证,例如'yourhost.tld/krb5LoginUrl'
您的 Webworker(例如提供 task.js):
self.addEventListener('message', function(e) {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", e.data);
oReq.send(null);
function reqListener () {
self.postMessage(this.status);
}, false);
在您的主应用程序代码中注册工作人员: const worker = new Worker('task.js');
worker.postMessage(/krb5LoginUrl); // Sends the url to our worker and triggers xmlHttpRequest.
worker.addEventListener('message', function (e) {
if (e.data == 200) {
console.log("Krb5 login successful");
} else {
console.log("Krb5 login failed");
}
}, false);
}
关于javascript - 检查 Windows 身份验证是否可用于 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43126342/