相关疑难解决方法(0)

403 Forbidden vs 401 Unauthorized HTTP响应

对于存在的网页,但对于没有足够权限的用户(他们未登录或不属于正确的用户组),要提供的正确HTTP响应是什么?401?403?别的什么?到目前为止,我对每个人的看法都不太清楚.哪些用例适合每个响应?

http-status-codes http-response-codes http-headers http-status-code-403 http-status-code-401

2544
推荐指数
18
解决办法
97万
查看次数

如何禁止浏览器的身份验证对话框?

我的Web应用程序有一个登录页面,通过AJAX调用提交身份验证凭据.如果用户输入正确的用户名和密码,一切都很好,但如果没有,则会发生以下情况:

  1. Web服务器确定虽然请求包含格式良好的Authorization标头,但标头中的凭据无法成功进行身份验证.
  2. Web服务器返回401状态代码,并包含一个或多个WWW-Authenticate标头,列出支持的身份验证类型.
  3. 浏览器检测到对XMLHttpRequest对象的调用的响应是401,响应包括WWW-Authenticate头.然后它会弹出一个身份验证对话框,再次询问用户名和密码.

这一切都很好,直到第3步.我不希望弹出对话框,我想要在我的AJAX回调函数中处理401响应.(例如,通过在登录页面上显示错误消息.)我希望用户重新输入他们的用户名和密码,当然,但我希望他们看到我友好,安心的登录表单,而不是浏览器的丑陋,默认验证对话框.

顺便说一句,我无法控制服务器,所以让它返回自定义状态代码(即401以外的东西)不是一个选项.

有什么办法可以抑制身份验证对话框吗?特别是,我可以在Firefox 2或更高版本中禁止"需要验证"对话框吗?有没有办法在IE 6及更高版本中禁止连接到[主机]对话框?


编辑
作者的其他信息(9月18日):
我应该补充说,浏览器的身份验证对话框弹出的真正问题是它给用户提供的信息不足.

用户刚刚通过登录页面上的表单输入了用户名和密码,他认为他已经正确输入了这些用户名和密码,并且他点击了提交按钮或按回车键.他的期望是,他将被带到下一页,或者可能被告知他输入的信息不正确,应该再试一次.但是,他会出现一个意外的对话框.

对话是没有的,他只是一个事实确认没有输入用户名和密码.它没有明确说明存在问题,他应该再试一次.相反,该对话框向用户显示诸如"网站说:' [领域] '之类的神秘信息." 凡[境界]是,只有一个程序员可以爱很短的领域名称.

Web broswer设计师注意到:如果对话框本身更加用户友好,没有人会问如何抑制身份验证对话框.我正在登录表单的全部原因是我们的产品管理团队正确地认为浏览器的身份验证对话框太糟糕了.

javascript ajax http-authentication

79
推荐指数
4
解决办法
5万
查看次数

如果我只使用OpenID,我应该在401s上传递WWW-Authenticate标头?

HTTP规范声明:

10.4.2 401未经授权

该请求需要用户身份验证.响应必须包含WWW-Authenticate头字段(第14.47节),其中包含适用于所请求资源的质询.

如果我支持的唯一登录方案是OpenID(或CAS或OAuth令牌,等等),我应该在这个字段中添加什么?也就是说,如何指示客户端需要预先验证并创建会话,而不是尝试与每个请求一起发送凭据?

在您回答之前,"不要发送401;发送3xx重定向到OpenID登录页面",对于非HTML客户端呢?例如,Stack Overflow如何执行我的自定义软件可以与之交互的API?

openid authentication http http-headers

34
推荐指数
1
解决办法
2万
查看次数

java.io.IOException:未找到身份验证质询

我是android的新手,这是我在android上的第一个项目.我在"认证"问题上苦苦挣扎了一天多.我尝试了几个选项,但没有一个可行.

基本上,我想调用REST API并获得响应.我确信API中没有问题,因为我在另一个iOS应用程序中使用相同的API.

我传递授权标题但仍然显示身份验证未找到消息.我发现与stackoverflow相关的问题很少,但是其中一些没有用,有些对我没有意义.

我得到状态代码401.我知道这意味着要么没有传递身份验证,要么传递,那么它们就错了.在这里,我确信我传递的是正确的.

以下是我的代码:

try {
    url = new URL(baseUrl);
}
catch (MalformedURLException me) {
     Log.e(TAG, "URL could not be parsed. URL : " + baseUrl + ". Line : " + getLineNumber(), me);
     me.printStackTrace();
}

try {
    urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod(method); 
    urlConnection.setConnectTimeout(TIMEOUT * 1000);
    urlConnection.setChunkedStreamingMode(0);

    // Set HTTP headers                 
    String authString = "username:password";
    String base64Auth = Base64.encodeToString(authString.getBytes(), Base64.DEFAULT);
    urlConnection.setRequestProperty("Authorization", "Basic " + base64Auth);
    urlConnection.setRequestProperty("Accept", "application/json");
    urlConnection.setRequestProperty("Content-type", "application/json");

    if (method.equals("POST") || method.equals("PUT")) {
        // Set …
Run Code Online (Sandbox Code Playgroud)

java authentication android httpurlconnection ioexception

23
推荐指数
2
解决办法
3万
查看次数

如何使用JQuery AJAX使用HTTP Basic Auth阻止Firefox提示用户名/密码?

我正在编写一些浏览器端动态功能,并使用HTTP Basic Auth来保护一些资源.用户体验非常重要,并且高度定制.

这是一个简单的测试JQuery方法,最终将测试用户是否在表单中提供了正确的凭据:

$(document).ready(function() {
    $("#submit").click(function() {
    var token = Base64.encode($('#username').val() + ':' + $('#password').val());        
    $.ajax({
      url: '/private',
      method: 'GET',
      async: false,
      beforeSend: function(req) {
        req.setRequestHeader('Authorization', 'test:password');
      },
      error: function(request, textStatus, error) {
        if (request.status == 401) {
          alert('401');
        }
      }
    });
    return false;
  });
});
Run Code Online (Sandbox Code Playgroud)

如果不允许他们访问/private,那么他们应该只看到警告框.但是,在Firefox上,会弹出一个浏览器提供的登录表单(使用新凭据重试).Safari不会这样做.

我们希望通过自定义表单,淡入淡出,转换等完全控制体验.如何防止Firefox的默认框显示?(如果我们测试IE时会出现这个问题,我也很乐意听到那里的解决方案.)

javascript firefox jquery http-authentication

13
推荐指数
2
解决办法
2万
查看次数

如何防止Safari拦截对ajax请求的401响应

我在Safari扩展中遇到以下问题.我要求用户提供Web服务的用户名/密码,并发送快速请求以验证凭据是否正确.如果不是,那么该服务将以401认为应该响应.问题是Safari似乎在我的javascript代码可以处理它之前拦截了这个响应,显示灰色登录框而不是让我处理错误.

我能做些什么吗?我正在使用js库来进行调用,但它在功能上等同于以下jQuery.

$.ajax({
  type: "GET",
  url: url,
  username: username,
  password: password,
  success: function() { /* handle success */ },
  error: function() { /* handle error */ }
});
Run Code Online (Sandbox Code Playgroud)

javascript safari ajax

10
推荐指数
1
解决办法
2609
查看次数

在Postman中为Azure通知中心创建注册

我在Azure门户中创建了一个服务总线/通知中心.

现在我正在尝试使用基于此doc的Postman的Azure REST API :https: //msdn.microsoft.com/en-us/library/azure/dn223265.aspx

这是我的Postman配置:

这是以下网址的POST方法(创建注册) https://mysite.servicebus.windows.net/mysite-notif/registrations/?api-version=2015-01 (出于隐私原因,我在该网址中替换为mysite)

标题中,我输入了2个条目:

Content-Type application/atom + xml; type = entry; charset = utf-8

授权 Endpoint = sb:// [mysite] .servicebus.windows.net /; SharedAccessKeyName = DefaultFullSharedAccessSignature; SharedAccessKey = [mykey](这是我从Azure门户复制的连接信息)

Body中,我选择了raw-XML(txt/xml)并粘贴:

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
    <content type="application/xml">
        <WindowsRegistrationDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">
            <Tags>myTag, myOtherTag</Tags>
            <ChannelUri>{ChannelUri}</ChannelUri>
        </WindowsRegistrationDescription>
    </content>
</entry>
Run Code Online (Sandbox Code Playgroud)

(这是Windows Notification Service示例的本机注册)

当我从邮递员中发送此电话时,我收到401错误:

<Error>
    <Code>401</Code>
    <Detail>MalformedToken: The credentials contained in …
Run Code Online (Sandbox Code Playgroud)

api rest azure-notificationhub postman

8
推荐指数
2
解决办法
7023
查看次数