javascript - 检查 Windows 身份验证是否可用于 JavaScript

标签 javascript angular authentication single-sign-on windows-authentication

有没有一种方法可以检查 Windows 身份验证(协商、Kerberos、NTLM...)在浏览器中是否可用(使用 JavaScript 或其他方法),如果不可用,浏览器不会提示输入用户名和密码?

背景

我们正在开发 Angular2 SPA 企业应用程序,如果可用(用户正在从加入域的计算机访问应用程序),我们希望使用 Windows 身份验证进行 SSO,如果不可用,则优雅地故障转移到基于表单的身份验证(从Internet 或未加入域的计算机)。

设置

在服务器端有一个受 Windows 身份验证保护的资源(即 REST 方法)。当您使用 JavaScript 调用此 REST 方法时,将发生以下两种情况之一:

  1. 如果 Windows 身份验证可用,将调用方法,您将收到 200 OK 响应
  2. 如果 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/

相关文章:

javascript - Webpack 解析导入路径的目录(goCardless 作为样板)

javascript - 我如何检查 XML 标记的属性是否未定义 JavaScript (Mirth Connect)

javascript - 如何从 *ngIf 指令中启动一个函数?

javascript - Angular 发布表单数据(文本输入)到 Rest API

javascript - WebStorm - 隐藏 'template literals' 突出显示

javascript - 单选按钮中未定义模板引用变量

angular - 开 Angular Material Snackbar 在服务中

java - 如何使用 apache.commons.net.ftps 配置客户端身份验证?

rest - 使用REST api的Guid token 而不是用户名/密码进行基本身份验证

c# - 如何将新创建的用户登录到站点