[译] 401 vs 403

简介: 原文:401 vs 403多年来,关于“未授权”的场景应该使用什么样的 HTTP 状态码的讨论从未停歇过——并且原始的 HTTP 1.1 规范并未明确指出 401 (未授权)和 403 (禁止)的区别。

原文:401 vs 403

多年来,关于“未授权”的场景应该使用什么样的 HTTP 状态码的讨论从未停歇过——并且原始的 HTTP 1.1 规范并未明确指出 401 (未授权)和 403 (禁止)的区别。

但是,肯定有必要区分在请求中没有提供或者提供无效凭据以及提供有效凭据但是对于正要尝试的操作凭据中的“实体”却并未授权的情况。

这里有一些例子:

  • 在过去不错的 ASP.NET FormsAuth (在 Katana 中已经被应用到全新的 cookie 中间件里)中——401 会被转成 302 重定向到登录页面。对于匿名请求来说是不错的——但是当用户已经经过认证,一个失败的授权(比如,使用 [Authorize(Role = "foo")])也会导致登录页面的显示——这就会很不直观。你更倾向于解决这样的错误或者展示一个错误页。
  • 在 Web API 中,对于基于令牌的认证,你的客户端需要能够区分令牌是否过期还是缺少必要的域 (scope) 。“Bearer 令牌的使用”规范 (http://tools.ietf.org/html/rfc6750) 对于这有明确的说明。过期的或者有缺陷的令牌应该返回 401 ——缺少域应该返回 403 。

你可能已经听到过 HTTP 1.1 规范最近已经重写了。同样现在状态码的使用也更加明确

401 (未授权) 状态码指示请求没有被应用因为对于目标资源缺少合法的认证凭据。服务器生成的 401 响应 必须 发送一个 WWW-Authenticate 报文头,其字段至少包含一个可应用于目标资源的质询。

服务器接收到合法的凭据但是并不足以获取访问权限应该使用 403 (禁止) 状态码进行响应。

但是不幸的是,ASP.NET MVC/Web API 的 [Authorize] 属性并没有采取这样的方式——它总是发出 401 。对于失败的授权这个逻辑是简单的:“如果用户是匿名的——发出 401 ,如果不是——发出 403” (现在我们的域授权助手已经发出 403 了——参见 这里这里)。

也许我们会在 vNext 中修复它。

相关文章
|
11月前
|
安全 Linux 网络安全
组网神器WireGuard安装与配置教程(超详细)
组网神器WireGuard安装与配置教程(超详细)
20041 1
|
Java 关系型数据库 MySQL
阿里巴巴Java开发手册简介(终极版、华山版、泰山版)(附下载地址)
阿里巴巴Java开发手册简介(终极版、华山版、泰山版)(附下载地址)
6700 0
|
移动开发 缓存 JavaScript
2021最新阿里代码规范(前端篇)
2021最新阿里代码规范(前端篇)
47626 11
2021最新阿里代码规范(前端篇)
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
136487 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
196439 63
|
缓存 负载均衡 监控
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
不知道什么是网关?正向代理?反向代理?负载均衡?负载均衡策略?Nginx和Gateway的区别?假如这些你都不知道,没关系,本文举了大量通俗易懂的例子来阐述了这些概念,保证小白也能看懂,并且最后还提到了gateway的一些配置。
4872 2
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
|
网络协议 Linux 网络安全
文件共享同步5种方式:NFS、NAS、rsync、scp、ftp
谈到文件同步,我们最直接的同步方式是采用rsync的同步软件,rsync同步可以保持server和client的强一致(server中的增删改都会同步client),但在实际场景中rsync可能并不能被采纳。
16514 0
|
11月前
|
缓存 监控 安全
什么是 DMZ(Demilitarized Zone)网络架构安全策略
什么是 DMZ(Demilitarized Zone)网络架构安全策略
|
JavaScript 前端开发 vr&ar
60个令人兴奋的ThreeJS网站示例
Three.js是一个JavaScript库,它使在Web上创建3D图形比直接使用WebGL容易得多。Three.js是网络上最受欢迎的3D JavaScript库,很容易上手。因此,在这篇文章中,我将展示一些创意网站的例子,以获得灵感,以使用Three.js JavaScript库创建和动画令人兴奋的基于3D浏览器的图形。
692 0
|
11月前
|
Kubernetes 应用服务中间件 nginx
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)(上)
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)
37045 28