我试图通过浏览器创建基本身份验证,但我无法真正实现.
如果此脚本不在此处,则浏览器身份验证将接管,但我想告诉浏览器用户即将进行身份验证.
地址应该是这样的:
http://username:password@server.in.local/
Run Code Online (Sandbox Code Playgroud)
我有一个表格:
<form name="cookieform" id="login" method="post">
<input type="text" name="username" id="username" class="text"/>
<input type="password" name="password" id="password" class="text"/>
<input type="submit" name="sub" value="Submit" class="page"/>
</form>
Run Code Online (Sandbox Code Playgroud)
还有一个脚本:
var username = $("input#username").val();
var password = $("input#password").val();
function make_base_auth(user, password) {
var tok = user + ':' + password;
var hash = Base64.encode(tok);
return "Basic " + hash;
}
$.ajax
({
type: "GET",
url: "index1.php",
dataType: 'json',
async: false,
data: '{"username": "' + username + '", "password" : "' + password + '"}', …Run Code Online (Sandbox Code Playgroud) 我的Web应用程序有一个登录页面,通过AJAX调用提交身份验证凭据.如果用户输入正确的用户名和密码,一切都很好,但如果没有,则会发生以下情况:
这一切都很好,直到第3步.我不希望弹出对话框,我想要在我的AJAX回调函数中处理401响应.(例如,通过在登录页面上显示错误消息.)我希望用户重新输入他们的用户名和密码,当然,但我希望他们看到我友好,安心的登录表单,而不是浏览器的丑陋,默认验证对话框.
顺便说一句,我无法控制服务器,所以让它返回自定义状态代码(即401以外的东西)不是一个选项.
有什么办法可以抑制身份验证对话框吗?特别是,我可以在Firefox 2或更高版本中禁止"需要验证"对话框吗?有没有办法在IE 6及更高版本中禁止连接到[主机]对话框?
编辑
作者的其他信息(9月18日):
我应该补充说,浏览器的身份验证对话框弹出的真正问题是它给用户提供的信息不足.
用户刚刚通过登录页面上的表单输入了用户名和密码,他认为他已经正确输入了这些用户名和密码,并且他点击了提交按钮或按回车键.他的期望是,他将被带到下一页,或者可能被告知他输入的信息不正确,应该再试一次.但是,他会出现一个意外的对话框.
对话是没有的,他只是一个事实确认没有输入用户名和密码.它没有明确说明存在问题,他应该再试一次.相反,该对话框向用户显示诸如"网站说:' [领域] '之类的神秘信息." 凡[境界]是,只有一个程序员可以爱很短的领域名称.
Web broswer设计师注意到:如果对话框本身更加用户友好,没有人会问如何抑制身份验证对话框.我正在登录表单的全部原因是我们的产品管理团队正确地认为浏览器的身份验证对话框太糟糕了.
有没有办法检查 Windows 身份验证(协商、Kerberos、NTLM...)在浏览器中是否可用(使用 JavaScript 或其他方法),如果不可用,浏览器不会提示输入用户名和密码?
背景
我们正在开发 Angular2 SPA 企业应用程序,并且希望在可用时使用 Windows 身份验证进行 SSO(用户从加入域的计算机访问应用程序),并在不可用时优雅地故障转移到基于表单的身份验证(从 Internet 或非访问)加入域的计算机)。
设置
在服务器端拥有受 Windows 身份验证保护的资源(即 REST 方法)。当您使用 JavaScript 调用此 REST 方法时,将会发生以下两种情况之一:
问题
显示登录提示是不受欢迎的,我们希望优雅地退回到基于表单的登录。
一些解决方案建议从响应中删除 WWW-Authenticate 标头,但这将阻止 Windows 身份验证工作,因为此步骤是 broser-server 协商身份验证协议的一部分。如果删除,浏览器将永远不会发送 NTLM 或 Kerberos 令牌。
我们控制前端和后端,因此可以修改任一后端以使其正常工作。此外,没有 CORS,一切都是来自单个域的服务器。
任何能够从客户端检测 Windows 身份验证是否可用的方法对我们来说就足够了。到目前为止我发现的是这个,但它仅适用于 IE,并且需要启用 ActiveX。 这个问题有些相关,但也没有解决方案,而且已经很老了。
javascript authentication windows-authentication single-sign-on angular