Http 401错误重现实验及解决办法

HTTP报错状态码详解 http报错状态码总结 信息响应(100–199), 成功响应(200–299), 重定向(300–399), 客户端错误(400–499) 服务器错误 (500–599) 阅读详情
AI摘要

本文深入解析IIS中401状态码的不同子状态码及其含义,包括登录失败、服务器配置问题等,并提供每种错误的重现方法与解决方案。

根据http协议对状态码的定义,401代表未经授权的访问。在IIS中在401的基础上定义了一系列的子状态码来代表各种不同情况下未经授权访问的具体原因。

401.1 - Logon failed. -登陆失败

401.2 - Logon failed due to server configuration.-基于服务器配置的登陆失败

401.3 - Unauthorized due to ACL on resource.-资源访问控制列表返回未授权

401.4 - Authorization failed by filter.-服务器filter返回未授权

401.5 - Authorization failed by ISAPI/CGI application.-服务器ISAPI/CGI返回未授权

 

这篇文章中主要来介绍各种常见401错误的重现方法相应的解决方案。在这之前首先介绍一下对于401问题的定位方式,即如何知道发生了401错误。


401问题的定位方式

对于401问题的定位我们要区分我们是在客户端还是在服务器端访问页面,因为服务器对于错误返回消息的配置不同使我们在浏览器中看到的结果大相径庭。


客户端对于401问题的定位

在客户端我们遇到401问题时经常会见到的页面如下,这是一个IIS 7及以上版本的默认401错误页面。

服务器也可以配置使用不同的错误页面来呈现这个问题。所以更为精确的定位方式我们还是要参考服务器返回的状态码。

在IE中打开F12开发者工具,切换到network选项卡,然后点start capturing。访问该网页,抓取的network追踪记录中就可以看到401的返回码。

服务端对于401问题的定位

在服务器端访问出错页面的结果如下,一般默认配置情况下服务器会显示详细的错误信息。


另外我们也可以通过查看IIS日志来确定详细的出错码。

打开IIS - Loggingfeature,注意需要确定SelectFields中选中了Protocal Status和Protocal Substatus (默认情况下是选中的)。


然后到日志记录中查找相应的请求记录,从而确定返回状态码与子码分别是什么。

 

#Software:Microsoft Internet Information Services 8.0

#Version:1.0

#Date:2012-10-05 04:34:24

#Fields:date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ipcs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken

2012-10-0504:34:24 ::1 GET /iisstart.htm - 80 - ::1Mozilla/5.0+(compatible;+MSIE+10.0;+Windows+NT+6.2;+WOW64;+Trident/6.0) -401 2 5 753


401.1 - Logon Failed

问题重现

401.1问题一般是因为用户名和密码无法在服务器通过认证导致。要重现这个问题可以在服务器禁用匿名访问方式。启用basic认证方式。

再次访问页面,就会弹出如下需要输入用户名和密码的对话框。

如果三次输入的用户名和密码出错的话,你就会得到这样一个页面

如果是服务器端详细的信息是这样的

解决方案

这种问题一般发生的原因就是用户名和密码不正确。可以尝试重置用户密码或通过另外一个用户登陆来定位是否是用户名密码的问题。

另外还有一种较为常见的在服务器的应用程序池运行在一个本地或者域账户的情况下,因为kerberos认证失败而导致401.1错误。这种问题的解决办法可以参照这里。


401.2 - Logon failed due to server configuration

问题重现

401.2问题一般是因为服务器配置原因导致的,比如最常见的服务器启用了基于401Challenge的认证方式,那么客户端尝试发送匿名请求给服务器,服务器就会返回401 Challenge给客户端,客户端受到这个回复之后就会弹出认证对话框,如上面重现401.1问题时的认证对话框。而这个401Challenge请求在服务器日志里面会记录成401.2。

所以当在日志中发现下面这种401.2错误的时候不用担心,因为可以看到用户名为空的请求返回了401.2,之后又有带了用户名的请求返回了200(请求成功)。

2012-10-0507:26:40 ::1 GET /iisstart.htm - 80 - ::1Mozilla/5.0+(compatible;+MSIE+10.0;+Windows+NT+6.2;+WOW64;+Trident/6.0) -401 2 5 7

2012-10-0507:27:08 ::1 GET /iisstart.htm - 80 - ::1Mozilla/5.0+(compatible;+MSIE+10.0;+Windows+NT+6.2;+WOW64;+Trident/6.0) -401 2 5 8

2012-10-0507:27:26 ::1 GET /iisstart.htm - 80domain\user1 ::1Mozilla/5.0+(compatible;+MSIE+10.0;+Windows+NT+6.2;+WOW64;+Trident/6.0) - 200 0 0 409

另外一种401.2的重现方式非常简单,是把所有的认证方式全部禁用,再次访问网页就会返回401.2错误消息。在第一节问题一般定位方式截图中显示的401.2错误就是把所有的认证方式禁用得到的。

第三种方式比较特殊,我们可以通过服务器端配置authorization rule来禁止或者允许特定的用户访问。为了重现问题我们禁用所有的用户。


访问网页之后发现返回401.2错误,在服务器详细错误中在这里我们要关注的一点是Module中显示的信息,这里我们可以看到是UrlAuthorizationModule,而不是前面禁用了所有认证方式的IISWeb Core,这就告诉我们出错的地方在于配置的的Authorization Rules。

解决方案

第一种情况属于正常现象,不是问题

第二种情况即没有启用任何认证方式,只需要在IIS Manager里面启用需要的认证方式即可。

第三种情况即被Authorization Rule阻挡,则需要分析这个authorization rule是否是否必须来决定对他的更改。

还有第四种情况,就是在配置文件中指定了认证方式但是相应的认证模块没有安装。这种情况多发生在系统迁移的过程中。解决方案就是把相应的认证模块安装上。


401.3 - Unauthorized due to ACL on resource

问题重现

401.3问题是最明显的一个,即没有权限访问文件(夹),要重现这个问题我们可以将要访问的文件的安全性设置为拒绝任何人访问。然后请求该文件就会得到以下出错信息。



在这里需要关注的错误显示的Logon User,这样可以知道你正在以什么身份访问文件。

 

解决方案

调试401.3需要知道两件事,

第一是什么资源组织了访问,问题出在上级文件夹还是文件本身。

第二是我们以什么样的身份访问资源的时候被阻止了。

 

调试这个问题最好的工具是Process Monitor。打开Process Monitor过滤w3wp进程对文件的访问。就可以看到access deny被记录下来。同时还有访问身份信息。这样我们就可以在文件系统做相应的更改来解决问题。


401.4 - Authorization failed by filter

问题重现

401.4问题重现比起前面要更加费些周折,因为这个错误的意思是自定义filter返回了拒绝访问的错误。所以我们要先创建一个自定义filter。

这里值得注意的是在IIS6上只能创建自定义ISAPI Filter来处理进入的各种请求,创建ISAPI Extension来处理特定的请求。而这两种扩展方式在IIS7及以上的版本不再被推荐使用,取而代之的是创建Http Module和HttpHandler来扩展IIS的功能,而且支持托管和非托管两种模式,开发和调试都更加方便。

 

为了更形象的重现这个问题,我们还是采用ISAPI Filter的方式。创建ISAPI Filter需要两个文件。

401-4-Filter.def

LIBRARY      401-4-Filter

;DESCRIPTION  'filter to return 401.4'

EXPORTS
    HttpFilterProc
    GetFilterVersion
401-4-Filter.C
#include <windows.h>
#include <httpfilt.h>

#define DEFAULT_BUFFER_SIZE         1024
#define MAX_BUFFER_SIZE             4096

DWORD
OnPreprocHeaders(
    IN HTTP_FILTER_CONTEXT *            pfc,
    IN HTTP_FILTER_PREPROC_HEADERS *    pPPH
);

BOOL
WINAPI
GetFilterVersion(
    HTTP_FILTER_VERSION *           pVer
    )
{
    pVer->dwFilterVersion = HTTP_FILTER_REVISION;
    lstrcpyn( pVer->lpszFilterDesc,
             "Filter to return 401.4 error",
             SF_MAX_FILTER_DESC_LEN );
    pVer->dwFlags =
        SF_NOTIFY_ORDER_HIGH |
        SF_NOTIFY_PREPROC_HEADERS
        ;

    return TRUE;
}

DWORD
WINAPI
HttpFilterProc(
    IN HTTP_FILTER_CONTEXT *        pfc,
    DWORD                           dwNotificationType,
    LPVOID                          pvNotification
    )
{
    switch ( dwNotificationType )
    {
    case SF_NOTIFY_PREPROC_HEADERS:
        return OnPreprocHeaders(
            pfc,
            (HTTP_FILTER_PREPROC_HEADERS *) pvNotification );
    }

    return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

DWORD
OnPreprocHeaders(
    HTTP_FILTER_CONTEXT *           pfc,
    HTTP_FILTER_PREPROC_HEADERS *   pPPH
)
{
    SetLastError( ERROR_ACCESS_DENIED  );
    return SF_STATUS_REQ_ERROR;
}

将其编译成与application pool CPU架构(x86|x64)相同的classlibrary。然后通过IIS Manager功能视图中ISAPI Filter中加入编译产生的Dll。之后请求页面就会得到如下返回。

解决方案

可以看到详细信息中并没有显示出出问题的模块,这里就需要我们通过一定的调试手段来定位这个出错的模块在哪里。比较方便的方式是通过failed request tracing追踪请求,找到出错的模块。

详细的方法可以参考这里

http://support.microsoft.com/kb/942079/zh-cn


401.5 - Authorization failed by ISAPI/CGI application

问题重现

401.5问题的出现原因可能源于以下几个方面阻止了请求。

  • 自定义的ISAPIextension
  • CGI程序
  • ASP页面
  • 自定义handler

这里通过一个managedhttp handler来重现这个问题,将以下代码放在网站根目录下App_Code文件夹,然后在IISManager功能视图里选在Handler Mapping,添加Managed Handler,选择一个对应的请求路径,我们这里用它来处理所有*.aa的文件请求,之后在网站里面加入一个test.aa文件,通过浏览器发送请求。

using System.Web;

namespace 4015Handler
{
    public class 4015Handler: IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.StatusCode = 401;
            context.Response.SubStatusCode = 5;
            context.Response.End();
        }
    }
}

就会得到这样的结果。

解决方案

对于这个问题的定位方式与401.4一样,可以通过failedrequest tracing来跟踪消息,找到出错的模块。

 

详细方法如下

http://support.microsoft.com/kb/942078/zh-cn


Python request访问401错误与权限验证 在使用Python requests接口访问开发的过程中,遇到401错误,跟踪原因是 Unauthorized ,这个错误通常意味着我在尝试访问某个资源时侯,没有提供正确的身份验证信息,或者你的身份验证信息已经过期。 阅读详情

相关推荐

代理请求: Request failed with status code 404

HTTP状态码—请求错误 400 Bad Request 1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。 2、请求参数有误。 401 Unauthorized 当前请求需要用户验证。 402 Payment Required 该状态码是为了将来可能的需求而预留的。 403 Forbidden 服务器已经理解请求,但是拒绝执行它。 404 Not Found 请求失败,请求所希望得到的资源未被在服务器上发现 第一中可能:React中将你安装的proxy 或者是 cre

segegefe的博客 1万+

Request failed with status code 401 AxiosError: Request failed with status code 401

发送请求时出现error:Request failed with status code 401。401考虑到token问题和token编译问题。发现"Basic"中没加空格。查看请求拦截代码,没问题。结果:可以正常发送请求。

2301_76868945的博客 8196

HTTP状态码解析:401、403、502、503实战指南

HTTP状态码是Web开发中的基础通信机制,通过三位数字代码传递服务器响应状态。从原理上看,状态码分为信息响应(1xx)、成功(2xx)、重定向(3xx)、客户端错误(4xx)和服务端错误(5xx)五大类。其中401 Unauthorized表示认证失败,403 Forbidden代表权限不足,502 Bad Gateway反映网关问题,503 Service Unavailable表明服务过载。掌握这些状态码的差异对系统调试和API设计至关重要,特别是在微服务架构和Kubernetes环境中,正确处理50

weixin_33483304的博客 169

PicGo上传失败:Request failed with status code 401

将旧的delete后重新生成一个新的token,生成的时候记得选中repo,之后将新的token重新换到图床中即可。后面重新改了下图床设置的token,换了个新的上去就好了。

qq_62637200的博客 1702

飞书机器人鉴权失败?OpenClaw 401报错排查全攻略

在API对接中,HTTP状态码是定位问题的第一线索。401表示服务端无法确认调用者身份,与403的语义有本质区别。对飞书开放平台而言,无论是tenant_access_token的获取、缓存刷新,还是权限范围与IP白名单配置,任一环节异常都可能以Invalid Authentication的形式暴露。理解token从申请到使用的完整生命周期,能帮助开发者快速定位凭证配置错误、权限未开通、token过期等高频根因。在OpenClaw这类开源机器人框架与飞书消息API的集成场景中,鉴权失败往往不是单一配置问题,

weixin_31714129的博客 262

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

401错误信息页html,Http 401错误重现实验及解决办法

根据http协议对状态码的定义,401表明未经受权的访问。在IIS中在401的基础上定义了一系列的子状态码来表明各类不一样状况下未经受权访问的具体缘由。html401.1 - Logon failed.-登录失败windows401.2 - Logon failed due to server configuration.-基于服务器配置的登录失败浏览器401.3 - Unauthorized d...

weixin_39627665的博客 1813

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

kbq的博客 1万+

Web Service出现The request failed with HTTP status 401: Unauthorized错误

错误重现: 在VS2005 Beta2中创建基于File System的Web Site和Web Service,在Web Site中引用WebSevice,调用其中的默认的HelloWorld方法。 Dim ws As New localhost.Service() Response.Write(ws.HelloWorld()) 就会出现The request failed wit...

weixin_30333885的博客 2147

GPT大模型在数学建模中的实战应用:从思路启发到代码生成

数学建模是将现实问题抽象为数学问题并求解的核心方法,其关键在于通过合理的假设与简化,构建可计算的数学模型。传统建模依赖MATLAB等工具进行推演试错,而大语言模型的出现革新了这一范式。GPT等模型通过理解自然语言、辅助逻辑推理与代码生成,能有效提升建模效率与质量,在问题解析、模型构建、算法实现等环节提供关键支持。本文聚焦GPT在数学建模中的具体应用,涵盖赛题解读、模型推导、代码生成与结果分析,并结合实战案例,探讨如何将其作为“副驾驶”融入建模全流程,实现人机协同的智能化建模。

weixin_29061465的博客 322

emqx Java 订阅以及发送 结合若依框架

emqx Java 订阅以及发送 结合若依框架

Spo的博客 1612

Web Service 使用时出现 HTTP Status 401: Unauthorized

在调用 Web Service 时,实际遇到的情况: 1, 如果当前用户有权限,且IIS 中设定禁止匿名访问,则需要在代码中增加以下代码: webService.UseDefaultCredentials = true 2,如果当前用户没有权限,但IIS 中设定禁止匿名访问,就会出现此401 错误,可开启匿名访问解决: enable anonymous authentication

James.Duan@优快云 1万+

VS中的C#项目怎样引入另一个项目

场景 在C#项目A中需要引用项目B。 实现 将项目B手动复制到A所在的项目目录下的同一个解决方案中,即与项目A同级的目录下。 在VS中打开项目B,打开解决方案资源管理器--右击解决方案--添加--现有项目 然后找到项目B的.csproj文件打开。 然后看到资源管理器中已经将B添加进来了 点击项目A的引用-右键-添加 将项目下的解决方...

BADAO_LIUMANG_QIZHI的博客 9319

Canonical.com项目中的401错误问题分析与解决

Canonical.com项目中的401错误问题分析与解决 在软件开发和使用过程中,遇到各种HTTP状态码错误是常见现象。本文将以Canonical.com项目中出现的401错误为例,深入分析这类问题的成因和解决方案。 问题现象 用户在使用Canonical.com平台的候选人页面时,突然遭遇401错误。该错误表现为用户无法访问原本可以正常使用的候选人页面,且在多个主流浏览器(Chrome、Moz...

gitblog_07147的博客 313

【Bug已解决】Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows la

原始报错:Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows laptops场景:用户在 Windows 笔记本上登录应用成功了,但随后每个业务请求都返回 401,提示"Missing bearer/basic authentication"。登录态像是"假的"——明明登了,请求却没带任何认证信息。多台 Windows 设备都能复现。

一键难忘的博客 589

月薪2万+的网络工程师,到底藏着哪些“绝活”?

在IT圈,网络工程师是个既神秘又硬核的职业。月薪2万+的网工,早已不是只会拉网线、改IP的“IT民工”,而是掌握了一身“绝技”的技术大牛。他们能让企业网络如丝般顺滑,面对宕机临危不乱,还能用自动化脚本批量搞定上百台设备。想知道这些高薪网工的秘密武器是什么?今天,我就以一个老网工的视角,结合自己和同行们的实战经验,扒一扒那些月薪2万+的网络工程师都身怀哪些绝技。如果你也想挤进高薪行列,不妨参考参考!

网络技术联盟站 359

访问WebService出现IIS错误:The request failed with HTTP status 401: Unauthorized

本文转载自 轻量级程序员 ------------------------------------------------- 错误重现: 在VS2005 Beta2中创建基于File System的Web Site和Web Service,在Web Site中引用WebSevice,调用其中的默认的HelloWorld方法。 Dim ws As New localhost.Servi...

weixin_30567471的博客 397

YOLO11涨点优化:卷积魔改 | DCNv2升级版本,助力检测

在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版本——DCNv2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 967

vue-cli-service Axios 持续返还401

后端: 在登录超时或没有登录的情况,所有请求都会拒绝并且返还HTTP状态码401 前端: 前端将认证的Token放到loadStorage中,在认证失效时候清空。 在接到HTTP状态码为401时,自动的跳转到登录页面,因此有了下面 axios 的全局拦截器 import axios from 'axios'; import router from './router' // 全局在处理到未认证的错误时统一进入回到根路径 axios.interceptors.response.use(functio

q1009020096的博客 808

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

解决IntelliJ IDEA推送Gitee时的401认证错误

在Git版本控制系统中,身份认证是代码推送的关键环节。401 Unauthorized错误通常由凭证失效或配置不当引起,涉及HTTPS/SSH协议选择、凭证存储机制和权限验证等多个技术点。通过理解操作系统级凭证管理(如Windows凭据管理器、macOS钥匙串)和现代认证方式(如SSH密钥对、个人访问令牌),开发者可以构建更安全的代码推送流程。本文针对IntelliJ IDEA集成开发环境,详细分析Gitee平台代码推送时的典型认证问题,提供从协议选择、密钥配置到代理设置的全套解决方案,特别适用于团队协作开

weixin_28839629的博客 204

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Azure AKS集群首次拉取ACR镜像401错误分析与解决方案

在Azure Kubernetes Service(AKS)集群中,当使用托管身份(Managed Identity)并配置了ACRPull角色后,首次从私有Azure Container Registry(ACR)拉取容器镜像时会出现401未授权错误。具体表现为: 1. 首次拉取任何镜像都会失败,返回401 Unauthorized错误 2. 第二次尝试拉取同一镜像会成功 3. 成功拉取后,同...

gitblog_07529的博客 592

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HTTP状态码详解

HTTP状态码详解http状态码分类请求错误类(客户端错误)服务端错误 http状态码分类 1.消息类(1字头) 2.成功类(2字头) 3.重定向类(3字头) 4.请求错误类(4字头) 5.服务器错误类(5、6字头) 请求错误类(客户端错误) 400: 的英文含义400 Request Header Or Cookie Too Large,顾名思义,头信息或者Cookie信息太多了 ,复现这个状态码只需要添加够长的头信息或者Cookie信息即可 401 的含义是401 Authorization Req

qq_54894935的博客 289

一个HTTP Basic Authentication引发的异常

这几天在做一个功能,其实很简单。就是调用几个外部的API,返回数据后进行组装然后成为新的接口。其中一个API是一个很奇葩的API,虽然是基于HTTP的,但既没有基于SOAP规范,也不是Restful风格的接口。还好使用它也没有复杂的场景。只是构造出URL,发送一个HTTP的get请求,然后给我返回一个XML结构的数据。 我使用了Spring MVC中的RestTem...

weixin_30371469的博客 113
上一篇: HttpException "Request timed out"的发生原因及调试方法
下一篇: ASP.NET未处理异常(Unhandled Exception)调试试验
WebDebug
博客等级 码龄14年 17粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值