众所周知,Web使人们可以很方便的访问分布在世界各个角落里信息。但是仅仅是方便还是不够的,并不是所有的信息都适合在互联网上公开访问,我们需要保证只有特定的人才能看到我们的敏感信息并且执行特定的操作。

服务器需要通过某种方式了解访问用户的身份。一旦服务器知道了用户身份,就可以判断用户可以访问的事务和资源了。认证意味着要证明客户端访问用户是谁。通常情况是通过提供用户名和密码来认证的。HTTP为我们提供了一些原生的工具。今天我们来看下基本认证。

HTTP质询/响应认证框架

HTTP提供了一个原生的质询/响应框架,简化了对用户的认证过程。HTTP的认证模型如图所示。

Web服务器接收到一条HTTP请求报文时,服务器没有直接响应请求的资源,而是以一个“认证质询”进行响应,要求用户提供一些保密信息来说明其身份。用户再次发起请求时,要附上保密证书(用户名和密码)。如果与要求的不匹配,服务器可以再次质询客户端,或者产生一条错误信息。如果证书匹配则返回请求的资源。

认证协议与首部

  1. HTTP提供可定制的控制首部,为不同的认证协议提供了一个可扩展框架。
  2. HTTP提供了两个认证协议:基本认证和摘要认证。

基本认证实例

  1. 客户端请求某资源。
  2. 服务器对用户进行质询时,会返回一条401Unauthorized响应,并在WWW-Authenticate首部中说明可以使用的认证方式。
  3. 客户端重新发送请求,并在Authorization首部附加上用户名、密码等其他一些认证参数。
  4. 授权成功完成后,服务器会返回一个正常的状态码(比如,200  OK),对于高级算法来说,可能还会在Authentication-Info首部附加额外的信息。

HTTP基本认证将用户名和密码打包在一起,并使用base-64编码方式对其进行编码。具体过程如下图所示。

基本认证的安全缺陷

  1. 基本认证通过网络发送用户名和密码,虽然进行base-64编码可以隐藏用户名和密码,但是很容易通过反向编码过程进行解码。
  2. 即使密码以更加难以解码的方式加密,第三方用户仍然可以捕获被修改过的用户名和密码,并通过重放攻击获取服务器的访问权限。
  3. 很多用户会将不同的服务使用相同的用户名和密码,基本认证直接发送用户名和密码,会对一些重要的服务(比如在线银行网站)造成威胁。
  4. 基本认证没有提供任何针对代理和中间人节点的防护措施,他们没有修改认证首部,但却修改了报文的其余部分,这样就严重的改变了事务的本质。
  5. 假冒服务器很容易骗过基本认证。如果在用户实际链接到一台恶意服务器或者网关的时候,能够让用户相信他链接的是一个受基本认证保护的合法主机,攻击者就可以请求用户输入密码。
  6. IIS中站点默认开启匿名身份验证,并可以直接访问。

基本认证实例

  1. IIS中站点默认开启匿名身份验证,并可以直接访问

2. 关闭匿名认证,开启基本认证方式,直接访问需要输入用户名密码

3.客户端模拟基本认证过程

控制台模拟代码如下

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication_HttpSec
{
class Program
{
static void Main(string[] args)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("HTTP://Localhost"));
request.Method = "Get"; WebResponse response = null;
try
{
response = request.GetResponse();
}
catch (WebException ex)
{
Console.WriteLine("访问发生异常,异常信息如下:"+ ex.Message);
Console.WriteLine("异常信息返回的质询响应头为:");
foreach (string key in ex.Response.Headers.Keys)
{
Console.WriteLine(" "+ key +":"+ex.Response.Headers[key]);
} Console.WriteLine("添加Authorization认证头部并重新发送请求");
HttpWebRequest request2 = (HttpWebRequest)HttpWebRequest.Create(new Uri("HTTP://Localhost"));
request2.Method = "Get";
request2.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("administrator:P@ssword")));
try
{
response = request2.GetResponse();
}
catch (WebException ex2)
{
Console.WriteLine("添加Authorization认证头部并重新发送请求发生异常:"+ex2.Message);
Console.Read();
return;
}
Stream stream = response.GetResponseStream();
System.IO.StreamReader reader = new StreamReader(stream);
string content = reader.ReadToEnd();
Console.WriteLine("请求响应的内容如下");
Console.WriteLine(content);
} Console.Read(); }
}
}

  

HTTP基本认证的更多相关文章

  1. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  2. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  3. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  4. Android 指纹认证

    安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...

  5. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  6. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  7. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

    在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣的,于是来一篇详解登录原理的文章.本文会涉及到Claims-based(基于声明)的认证,我们会详细 ...

  8. "用户增长"--快速身份认证实现用户增长的技术和产品方案

    "用户增长"--快速身份认证实现用户增长的技术和产品方案 1   引言 作为一个互联网产品,用户量的增长是一个非常重要的衡量指标. 这是一个集合了销售,市场,运营,技术的综合能力. ...

  9. 基于token的多平台身份认证架构设计

    基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...

  10. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

随机推荐

  1. Yii2 中禁用csrf校验

    Yii2 默认开启csrf校验,但是有些时候确实不需要校验,比如对外提供API 一般做法直接在xxController中增加属性: public $enableCsrfValidation = fal ...

  2. 论人品 | | noip1015模拟考

    第一题:火车进站... 由于有了老师给的助攻,第一题的时间为半小时,主要在读题了.... jzoj1146 第二题:car 难在正方形的计算? 第二题时间:1.5hour 第三题:sort排序?

  3. Tier和RBD Cache的区别

    相同点 缓存 数据不会持久保存在ssd或者内存:预读回写直写 都需要解决缓存数据和磁盘数据不一致和“内存页”置换的问题. 差异点 缓存的位置不同,tier是rados层在osd端进行数据缓存,也就是说 ...

  4. vertx简单服务创建

    import java.util.HashMap;import java.util.Map; import org.slf4j.Logger;import org.slf4j.LoggerFactor ...

  5. Springmvc mybatis

    http://www.icoolxue.com/album/show/216 07

  6. PMI列子1

    遍历得到PMI中,是注释类型的,你可以参考一下.int num_text, thetype, thesubtype;tag_t  draft_aid_tag = NULL_TAG;UF_UI_open ...

  7. Jmeter测试结果分析

    *.jtl文件内容: 请求发出的绝对时间,响应时间,请求的标签,返回码,返回消息,请求所属的线程,数据类型,是否成功,字节,             响应时间 1458294513309,   382 ...

  8. python脚本执行Scapy出现IPv6警告WARNING解决办法

    安装完scapy,写了脚本执行后执行: WARNING: No route found for IPv6 destination :: (no default route?) 原因是用 from sc ...

  9. "i++"和"++i"浅析

    public class a{     public static void main(String[] args){         int k =100;         k++;//k+=,k ...

  10. px4flow通过iic读取具体寄存器数据程序

    底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码 include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件 in ...