登录工程一:传统 Web 应用中的身份验证技术

2023-11-11

      标题中的 “传统Web应用” 这一说法并没有什么官方定义,只是为了与“现代化Web应用”做比较而自拟的一个概念。所谓“现代化Web应用”指的是那些基于分布式架构思想设计的,面向多个端提供稳定可靠的高可用服务,并且在需要时能够横向扩展的Web应用。相对而言,传统Web应用则主要是直接面向PC用户的Web应用程序,采用单体架构较多,也可能在内部采用SOA的分布式运算技术。

一直以来,传统Web应用为构成互联网发挥了重要作用。因此传统Web应用中的身份验证技术经过几代的发展,已经解决了不少实际问题,并最终沉淀了一些实践模式。


       在讲述多种身份鉴权技术之前,要强调一点:在构建互联网Web应用过程中,无论使用哪种技术,在传输用户名和密码时,请一定要采用安全连接模式。因为无论采用何种鉴权模型,都无法保护用户凭据在传输过程中不被窃取。

Basic和Digest鉴权

基于HTTP的Web应用离不开HTTP本身的安全特性中关于身份鉴权的部分。虽然HTTP标准定义了好几种鉴权方式,但真正供Web应用开发者选择的并不多,这里简要回顾一下曾经被广泛运用过的Basic 和 Digest鉴权。

基于HTTP的Web应用离不开HTTP本身的安全特性中关于身份鉴权的部分。虽然HTTP标准定义了好几种鉴权方式,但真正供Web应用开发者选择的并不多,这里简要回顾一下曾经被广泛运用过的Basic 和 Digest鉴权。

不知道读者是否熟悉一种最直接向服务器提供身份的方式,即在URL中直接写上用户名和密码:

 http://user:passwd@www.server.com/index.html

这就是Basic鉴权的一种形式。

Basic和Digest是通过在HTTP请求中直接包含用户名和密码,或者它们的哈希值来向服务器传输用户凭据的方法。Basic鉴权直接在每个请求的头部或URL中包含明文的用户名或密码,或者经过Base64编码过的用户名或密码;而Digest则会使用服务器返回的随机值,对用户名和密码拼装后,使用多次MD5哈希处理后再向服务器传输。服务器在处理每个请求之前,读取收到的凭据,并鉴定用户的身份。

Basic和Digest鉴权有一系列的缺陷。它们需要在每个请求中提供凭据,因此提供“记住登录状态”功能的网站中,不得不将用户凭据缓存在浏览器中,增加了用户的安全风险。Basic鉴权基本不对用户名和密码等敏感信息进行预处理,所以只适合于较安全的安全环境,如通过HTTPS安全连接传输,或者局域网。

看起来更安全的Digest在非安全连接传输过程中,也无法抵御中间人通过篡改响应来要求客户端降级为Basic鉴权的攻击。Digest鉴权还有一个缺陷:由于在服务器端需要核对收到的、由客户端经过多次MD5哈希值的合法性,需要使用原始密码做相同的运算,这让服务器无法在存储密码之前对其进行不可逆的加密。Basic 和Digest鉴权的缺陷决定了它们不可能在互联网Web应用中被大量采用。

简单实用的登录技术

对于互联网Web应用来说,不采用Basic或Digest鉴权的理由主要有两个:

1. 不能接受在每个请求中发送用户名和密码凭据
2. 需要在服务器端对密码进行不可逆的加密

因此,互联网Web应用开发已经形成了一个基本的实践模式,能够在服务端对密码强加密之后存储,并且尽量减少鉴权过程中对凭据的传输。其过程如下图所示:

这一过程的原理很简单,专门发送一个鉴权请求,只在这个请求头中包含原始用户名和密码凭据,经服务器验证合法之后,由服务器发给一个会话标识(Session ID),客户端将会话标识存储在 Cookie 中,服务器记录会话标识与经过验证的用户的对应关系;后续客户端使用会话标识、而不是原始凭据去与服务器交互,服务器读取到会话标识后从自身的会话存储中读取已在第一个鉴权请求中验证过的用户身份。为了保护用户的原始凭据在传输中的安全,只需要为第一个鉴权请求构建安全连接支持。

服务端的代码包含首次鉴权和后续检查并授权访问的过程:

IUser _user_;  
if( validateLogin( nameFromReq, pwdFromReq, out _user _)){  
  Session["CurrentUser"] = _user_;  
}

(首次鉴权)

 IUser _user_ = Session["CurrentUser"] as IUser;  
 if( _user_ == null ){  
     Response.Redirect( "/login?return_uri=" + 
     Request.Url.ToString() );  
     return;  
 }

(后续检查并拒绝未识别的用户)

类似这样的技术简易方便,容易操作,因此大量被运用于很多互联网Web应用中。它在客户端和传输凭据过程中几乎没有做特殊处理,所以在这两个环节尤其要注意对用户凭据的保护。不过,随着我们对系统的要求越来越复杂,这样简易的实现方式也有一些明显的不足。比如,如果不加以封装,很容易出现在服务器应用程序代码中出现大量对用户身份的重复检查、错误的重定向等;不过最明显的问题可能是对服务器会话存储的依赖,服务器程序的会话存储往往在服务器程序重启之后丢失,因此可能会导致用户突然被登出的情况。虽然可以引入单独的会话存储程序来避免这类问题,但引入一个新的中间件就会增加系统的复杂性。

传统Web应用中身份验证最佳实践

上文提到的简单实用的登录技术已经可以帮助建立对用户身份验证的基本图景,在一些简单的应用场景中已经足够满足需求了。然而,用户鉴权就是有那种“你可以有很多种方法,就是不怎么优雅” 的问题。

最佳实践指的是那些经过了大量验证、被证明有用的方法。而用户鉴权的最佳实践就是使用自包含的、含有加密内容的 Cookie 作为替代凭据。其鉴权过程与上文所提到基于会话标识的技术没有什么区别,而主要区别在于不再颁发会话标识,取而代之的是一个代表身份的、经过加密的 “身份 Cookie”。

1. 只在鉴权请求中发送一次用户名和密码凭据
2. 成功凭据之后,由服务器生成代表用户身份的 Cookie,发送给客户端
3. 客户端在后续请求中携带上一步中收到的 “身份 Cookie”
4. 服务器解密”身份 Cookie”,并对需要访问的资源予以授权

这样,我们消除了对服务器会话存储的依赖,Cookie本身就有有效期的概念,因此顺便能够轻松提供“记住登录状态”的功能。

另外,由于解密Cookie、既而检查用户身份的操作相对繁琐,工程师不得不考虑对其抽取专门的服务,最终采用了面向切面的模式对身份验证的过程进行了封装,而开发时只需要使用一些特性标注(Attribute Annotation)对特定资源予以标记,即可轻松完成身份验证预处理。

传统Web应用中的单点登录

单点登录的需求在向用户提供多种服务的企业普遍存在,出发点是希望用户在一个站点中登录之后,在其他兄弟站点中就不需要再次登录。

如果多个子站所在的顶级域名一致,基于上文所述的实践,可以基于Cookie共享实现最简单的单点登录:在多个子站中使用相同的加密、解密配置,并且在用户登录成功后设置身份 Cookie时将domain值设置为顶级域名即可。这样,只要在其中一个网站登录,其身份 Cookie将在用户访问其他子站时也一起带上。不过实际情况中,这个方案的应用场景很有限,毕竟各个子站使用的用户数据模型可能不完全一致,而加密密钥多处共享也增加了服务器应用程序的安全风险。另外,这种方式与“在多个网站中分别存储相同的用户名与密码”的做法相似,可以说是一种“相同的登录”(Same Sign-On),而不是“单点登录”(Single Sign-On)。

对于单点登录需求来说,域名相同与否并不是最大的挑战,集成登录系统对各个子站点的系统在设计上的影响才是。我们希望便利用户的同时,也期待各个子系统仍拥有独立用户身份、独立管理和运维的灵活性。因此我们引入独立的鉴权子站点。

当用户到达业务站点A时,被重定向到鉴权站点;登录成功之后,用户被重定向回到业务站点 A、同时附加一个指示“已有用户登录”的令牌串——此时业务站点A使用令牌串,在服务器端从鉴权子站点查询并记录当前已登录的用户。当用户到达业务站点B时,执行相同流程。由于已有用户登录,所以用户登录的过程会被自动省略。

这样的单点登录系统能够较好地解决在多个站点中共享用户登录状态的需求。不过,如果在编程实践过程中略有差池,就会让用户陷入巨大的安全风险中。例如,在上述重定向过程中,一旦鉴权系统未能验证返回URL的合法性,就容易导致用户被钓鱼网站利用。在传统Web应用开发实践中,被广泛部署的身份验证体系是比较重量级的WS-Federation 和 SMAL 等鉴权协议和相对轻量级的 OpenID 等技术。

总结

本文简要总结了在传统Web应用中,被广泛使用的几种典型用户登录时的鉴权处理流程。总体来说,在单体 Web 应用中,身份验证过程并不复杂,只要稍加管理,可以较轻松地解决用户鉴权的问题。但在传统 Web 应用中,为了解决单点登录的需求,人们也尝试了多种方式,最终仍然只有使用一些较复杂的方案才能较好地解决问题。

在现代化 Web 应用中,围绕登录这一需求,俨然已经衍生出了一个新的工程。“登录工程” 并不简单,在后续篇目中将会介绍现代化 Web 应用的典型需求及解决方法。


转自:thoughtworkers    http://insights.thoughtworkers.org/traditional-web-app-authentication/



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

登录工程一:传统 Web 应用中的身份验证技术 的相关文章

  • C++ QT连接SQL Server基操

    以下是一个使用C QT连接SQL Server的示例代码 include
  • uniapp登录流程详解uni.login

    uni login OBJECT 登录 H5平台登陆注意事项 微信内嵌浏览器运行H5版时 可通过js sdk实现微信登陆 需要引入一个单独的js 详见普通浏览器上实现微信登陆 并非开放API 需要向微信申请 仅个别开发者有此权限H5平台的其
  • 带你认识一下“京东到家-网关系统”

    京东到家三周年活动已然结束 在这2年里 我们的网关系统经历过了618 1020 双11 双12 415等多个非常有意义的考试 回顾起来依旧让人觉得很刺激 每次考前我们和市场部都做了大量的效果预估 压测 扩容 但是活动当日依旧是惊心动魄 瞬时
  • 2021组队训练赛第11场

    我们的终极目标不是AC 而是获取经验 2021组队训练赛第11场 我们的终极目标不是AC 而是获取经验 问题 A ABB 题意 考点 问题 C Bob in Wonderland 题意 考点 问题 F Zeldain Garden 题意 考
  • Spring框架之注解编程

    代码和配置 代码结构 maven依赖
  • Xshell连接不上虚拟机的问题和解决办法

    第一次用xshell 一直连不上linux 搞了好久 也查了很多办法 但是最后也终于解决了 在这里我分享一下自己的解决办法 再列举网上的办法 希望可以帮助其他人 1 你的linux ip地址没有配置 ip地址没有配置 你需要自己配置 配置的
  • 转行IT:网络工程师VS网络安全工程师,哪个能带你走上人生巅峰?

    记得曾经有人说过这样一个俗语 三百六十行 行行转IT 或许听到这个话的时候会觉得是一句玩笑话 但是浏览到网络上一些关于就业的文章 就能够明白这句话的真正意义所在 随着互联网的发展 越来越多人选择 甚至转行到IT行业 今天就带大家了解 网络工
  • AI实战营第二期 第五节 《目标检测与MMDetection》——笔记6

    文章目录 摘要 主要特性 常用概念 框 边界框 交并比 loU 感受野 有效感受野 置信度 目标检测的基本思路 难点 滑框 在特征图进行密集计算 边界框回归 基于锚框VS无锚框 NMS 非极大值抑制 使周密集预测模型进行推理步骤 如何训练
  • 在Ubuntu里面.AppImage格式安装

    具体而言 直接运行appimage就可以实现 安装 先给软件包可执行权限 chmod u x
  • CS5263芯片 DP转HDMI视频转换芯片 适用于HDMI单转线

    应用 DP转HDMI 视频芯片 分辨率可达到4K 60HZ 产品描述 Capstone CS5263AN是一款高性能DP1 4到HDMI2 0b转换器 设计用于将DP1 4源连接到HDMI2 0b接收器 CS5263AN集成了DP1 4兼容
  • Basic 1047 编程团体赛 (20分)

    题目 编程团体赛的规则为 每个参赛队由若干队员组成 所有队员独立比赛 参赛队的成绩为所有队员的成绩和 成绩最高的队获胜 现给定所有队员的比赛成绩 请你编写程序找出冠军队 输入格式 输入第一行给出一个正整数 N 1 0 4
  • STM32学习笔记—SPI通信

    1 SPI简介 2 函数配置 1 SPI简介 SPI通信是一种高速的 全双工的同步通信总线 通讯时 只占用四条线 MISO MOSI CS SCLK 其中cs为片选线 sclk为时钟线 一般同步通讯带有时钟线 像uart异步通信的就不带 m
  • Python:入门到放弃之基础篇(一)

    文章目录 前言 一 python的标识符 二 python变量类型 1 Number 2 String 3 List 4 Tuple 5 Set 6 Dictionary 三 python流程控制 1 顺序流程控制 2 分支流程控制 3 循
  • EMC电磁兼容测试项目简介

    EMC电磁兼容测试项目简介 一般来说 电气 电力设备产品要做的EMC电磁兼容测试主要包含浪涌 冲击 抗扰度 振铃波浪涌抗扰度 电快速瞬变脉冲群抗扰度 电压暂降 短时中断和电压变化抗扰度 工频电源谐波抗扰度 静电抗扰度 射频电磁场辐射抗扰度

随机推荐

  • TQ2440移植u-boot2016.11全过程记录-【4】LCD驱动移植并显示

    TQ2440移植u boot2016 11 LCD驱动移植并显示 LCD初始化流程分析 u boot的LCD初始化代码是在common lcd c中 我们找到lcd init函数 该函数功能流程为 lcd ctrl init初始化了LCD的
  • ipv6 socket编程实践

    Table of Contents 1 ipv6 socket编程实践 2 示例程序 ipv6 socket编程实践 ip地址长度变化 按照ipv4 255 255 255 255的地址格式 最长为15 加上结束符16字节长度 ipv6 的
  • FormData的详解

    转自 https blog csdn net yezitoo article details 78339201 FormData 1 概述 FormData类型其实是在XMLHttpRequest 2级定义的 它是为序列化表以及创建与表单格
  • 三相桥式全控整流电路

    三相桥式全控整流电路原理图 原理图 阴极连接在一起的3个晶闸管 VT1 VT3 VT5 称为共阴极组 阳极连接在一起的3个晶闸管 VT4 VT6 VT2 称为共阳极组 共阴极组中与a b c三相电源相接的3个晶闸管分别为VT1 VT3 VT
  • Swift 枚举与结构体

    Swift 枚举 枚举简单的说也是一种数据类型 只不过是这种数据类型只包含自定义的特定数据 它是一组有共同特性的数据的集合 Swift 的枚举类似于 Objective C 和 C 的结构 枚举的功能为 它声明在类中 可以通过实例化类来访问
  • PyTorch中实现数据集的自定义读取

    一 创作缘由 数据集呈现的方式有很多种 今天和大家仔细谈一谈当我们要读取的数据集信息存储在文本文件时 我们如何读取数据集 最近在实现一个垃圾分类的任务 数据集中每张图片的名称和数据标签都记录在了文本文件中 垃圾分类数据集介绍 一共有6种不同
  • mybatis3 mysql自动生成主键_mybatis自动生成主键

    mysql 使用useGeneratedKey属性 INSERT INTO STUDENTS NAME EMAIL PHONE VALUES name email phone 其他的方式 使用selectKey子标签 属性 order be
  • [优化篇]OpenStack的Cinder后端存储技术——GlusterFS(1)

    题记 上一篇已经介绍了OpenStack的Cinder后端使用NFS存储技术 为什么要使用NFS呢 一般情况下 如果你的网络是千兆网络 在如果你考虑性能的要求 存储设置到宿主机本地硬盘效率会更好 例如我们可以在计算节点上安装cinder v
  • Javascript里有个C:Part 3 - 深入对象

    http cnodejs org topic 4f16442ccae1f4aa270010bd em Javascript里有个C em 系列文章 br ol br li a title 编辑 Javascript里有个C Part hre
  • 利用轨迹拼接分析实时可达区域

    如何快速得知从你的位置开始出发 在当前的交通状况下 5分钟之内能够抵达的空间区域范围 当你掏出手机打车时 出租车调度平台应该通知哪些范围的车主进行接单 前言 本篇介绍的是被国际著名数据库和数据挖掘会议DASFAA 2020 CCF B类 成
  • 基于ssm的高校学生课堂考勤系统的设计与实现

    研究的背景 目的和意义 1 研究背景 信息技术的迅猛发展 已经引起社会的深刻变革 信息时代的到来 迫切要求我们的学校管理进行变革 因此 信息化的考勤系统就在这种情况下变的越来越受欢迎 它给教师带来了更加高效处理考勤的方法 使得教学能够比较顺
  • 第三方软件测试z5x电池,三款手游开黑一天不充电 vivo Z5x续航测试

    随着全面屏手机的全面流行 手机的屏幕尺寸越来越大 屏幕尺寸和性能的提高 让续航问题逐渐成为消费者心中的疙瘩 从之前非智能机的两天一充 三天一充 到如今的一天一充 甚至一天两充 如何保持手机随时有电 成了一个难题 全面屏设计的vivo Z5x
  • link标签的其他作用

    在html中link标签的最常用 主要作用是进行css外部样式的引用 还有其他功能是引入icon 也就是可以用来设置这个网站的图标 另一条平时不太容易接触的功能 就是DNS预解析 属于前端优化的范畴 可以加快网页打开 响应的速度 因为每一次
  • apex您所在的地区目前不提供此物品_apex混合精度加速

    Pytorch 简介 Nvidia提供了一个混合精度工具apex 可以加速pytorch的训练效率 空间和时间上 号称可以这不降低模型性能的情况下 将训练速度提升2 4倍 训练显存开销减少为原来的一半 开源地址如下 https github
  • (一)低功耗设计目的与功耗的类型

    一 低功耗设计的目的 1 便携性设备等需求 电子产品在我们生活中扮演了极其重要的作用 便携性的电子设备便是其中一种 便携性设备需要电池供电 需要消耗电池的能量 在同等电能提供下 低功耗设计的产品就能够工作更长的时间 时间的就是生命 因此低功
  • Java怎样写优秀的代码_写优质Java代码的4个技巧

    咱们平时的编程使命不外乎便是将相同的技能套件应用到不同的项目中去 关于大多数状况来说 这些技能都是能够满意方针的 然而 有的项目或许需求用到一些特别的技能 因而工程师们得深入研究 去寻觅那些最简略但最有用的办法 在前一篇文章中 咱们讨论了必
  • springmvc项目搭建

    第3天 Spring SpringMVC MyBatis集成 学习目标 SSM集成 集成流程理解 集成SpringMVC 集成Spring 集成MyBatis 事务测试 第1章 搭建环境 1 1 整合流程 整合说明 SSM整合可以使用多种方
  • 【论文精读】Hierarchical Text-Conditional Image Generation with CLIP Latents

    Hierarchical Text Conditional Image Generation with CLIP Latents 前言 Abstract 1 Introduction 2 Method 2 1 Decoder 2 2 Pri
  • 怎样将自己的电脑变成一个服务器(本地服务器)

    你想将自己的电脑变成一个服务器吗 或许你还不知道我们自己的电脑也可摇身一变成为服务器 现在我分享一下把我们的电脑变为服务器的方法 工具 原料 电脑 步骤1 打开 修改电脑相关服务功能 1 1 点击 开始 打开 控制面板 2 2 打开 程序
  • 登录工程一:传统 Web 应用中的身份验证技术

    标题中的 传统Web应用 这一说法并没有什么官方定义 只是为了与 现代化Web应用 做比较而自拟的一个概念 所谓 现代化Web应用 指的是那些基于分布式架构思想设计的 面向多个端提供稳定可靠的高可用服务 并且在需要时能够横向扩展的Web应用