我的网应用程序都有一个登录网页,提交认证的凭证,通过一个阿贾克斯的电话。如果用户进入正确的用户名和密码,一切都是好的,但是,如果不发生以下情况:

  1. 网络服务器确定的是,虽然请求中包括一个良好的授权标题,全权证书的标题并不成功进行身份验证。
  2. 该网络服务器返回401状态编码,并包括一个或多个WWW-Authenticate header清单的支持身份验证的类型。
  3. 浏览器检测到这的响应我的呼吁程序的对象是一个401和响应包括WWW-Authenticate header。然后它会弹出一个对话验证要求,再次用户名和密码。

这是所有收到第3步。我不希望的对话,我想要处理401响应我的AJAX回呼功能。(例如,通过显示错误信息登录网页。) 我想用户重新进入他们的用户名和密码,当然,但是我想让他们看到我的友好的、令人欣慰的登录的形式,不浏览器的丑陋的,默认的认证对话。

顺便说一下,我有没有控制服务器,所以具有这回一定义状况代码(即其他的东西比一个401)不是一个选项。

是否有任何种方式我可以抑制认证话?特别是,我可以抑制认证所需的对话在火狐2或以后呢?有没有办法抑制的连接 [主持人] 对话在即6和以后呢?


编辑
额外信息,从提交人(。18):
我要补充说,真正的问题与浏览器的认证对话出现了,它得到足够的信息的用户。

用户已经进入一个用户名和密码的形式上的登录网页,他认为他已经输入他们两个正确的,他有点击提交键或点击进入。他的期望是,他将要采取的下一个网页或者告诉我,他进入了他的信息不正确,请再试一次。但是,他,而不是提出了一个意想不到的对话框。

该对话是没有确认事实上他只是 有没有 输入的用户名和密码。它不明确状态,有一个问题,他应该再次尝试。相反,对话框向用户的神秘信息,如"网站说:'[领域]'." 哪里 [领域] 是一个简短的领域名称只有一个程序员可能的爱情。

网络浏览器设计师会注意:没有人会问,如何抑制认证的对话,如果对话本身是简单的用户更友好。的 整个 原因,我做一个登录的形式是,我们的产品管理小组正确地认为将浏览器'认证的对话是可怕的。

有帮助吗?

解决方案

我不认为这是可能的--如果使用浏览器HTTP客户实施,它总是会弹出,对话。两个黑客想到:

  1. 也许闪处理这种不同的(我还没有尝试过),因此具有闪电影编的请求可能会有帮助。

  2. 你可以设立一个'proxie'的服务,你在访问自己的服务器,并将它修改认证的标题一点,因此浏览器无法识别他们。

其他提示

我遇到了同样的问题,并在后台工程师在我的公司实施一行为,显然被认为是一个良好做法:当叫到一个URL返回401,如果客户已经设置的头 X-Requested-With: XMLHttpRequest, ,服务器下降的 www-authenticate 头在它的反应。

副作用是默认的认证弹出不会出现。

确保你的API呼叫的 X-Requested-With 头设置 XMLHttpRequest.如果是这样没有什么可以做的只是改变服务器的行为根据这种良好做法...

浏览器弹出一个提示当同时满足以下条件:

  1. HTTP状态是4xx
  2. WWW-Authenticate 头是存在的响应

如果你可以控制HTTP响应,然后你可以除去 WWW-Authenticate 头从响应,并浏览器不会弹出登录对话。

如果你不能控制的反应,可以设置一个代理过滤掉 WWW-Authenticate 头从反应。

据我所知(觉得免费的,以纠正我,如果我错误),也没有办法防止登录提示下一次的浏览器接收到 WWW-Authenticate 头。

我意识到这个问题及其回答是非常旧的。但是,我结束了在这里。也许其他人会如此。

如果你有访问代码,用于该网络的服务返回该401中。只需改变的服务来回报403(禁止)在这种情况,而不是401中。浏览器将不会提示全权证书的响应403中。403是正确的代码,用于一个经认证的用户,是不是授权一个特定的资源。似乎情况的任择议定书》。

从IETF文件403:

一个服务器收到的有效证书,不足以 访问应该作出响应,与403(禁止)状态码

在Safari你可以实现的,它与以下脚本时创建程序的对象:

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

2号线阻止了对话。

什么服务器技术的使用和是否有一个特定产品的使用对身份验证?

由于浏览器只是在做自己的工作,我相信你已经改变的事情上服务器方不返回401状态码。这可以使用定义的认证形式,简单地返回的形式再次当的认证失败。

在Safari土地,设置mozBackgroundRequest参数的程序(文档)以真实的抑制了这些对话和原因的要求只是失败。然而,我不知道如何好的跨浏览器的支持(包括是否的质量错误的信息在那些失败的请求是非常好的跨过浏览器。)

扬。vdbergh有的真相,如果你可以改变401在服务器上面对的另一个状态码,浏览器就不会赶上和油漆弹。另一个解决方案可能改变WWW-Authenticate header另一个定义的标题。我不敢相信你为什么不同的浏览器就可以不支持它,在几个版本的火狐,我们可以做到的把要求提mozBackgroundRequest,但在其他浏览器??在这里,还有一个有趣的 链接 这个问题在铬。

我有这个相同的问题与视5和VPN在那里时,我们都以外的非军事区使用VPN,我们发现自己具有回答这浏览器的信息。使用。净我只需处理的路由选择的错误使用

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

迄今为止它的工作,因为该指标下的行动的主控制器验证用户。在这一行动,如果登录失败,已登录控制,我用它来记录用户在使用LDAP query通过了到目录服务:

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

虽然这一工作的现迄今为止,我必须让你知道,我仍在进行测试和上述代码有没有理由运行,所以它受到去除...试验目前包括试图发现的情况的第二套代码的任何更多的使用。再次,这是一项正在进行的工作,但是由于它可能是一些援助或微动你的大脑用一些想法,我决定增加它现在...我会更新它的最终结果一旦所有的测试已经完成。

对于那些unsing C#在这里的 ActionAttribute 返回 400 而不是的 401, 和燕子基本授权对话。

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

使用如下:

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

希望这样可以节省一些时间。

我使用节点、表达和护照,并正在努力与同样的问题。我得到了它的工作的明确设定 www-authenticate 头往一个空串。在我的情况下,它看起来是这样的:

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

我希望这可以帮助别人!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top