认证概念:
服务器需要通过某种方式来了解用户的身份,一旦服务器知道了用户的身份,就可以判定用户可以访问事务和资源了;通常通过用户名和密码;
HTTP认证模型:
HTTP的两个官方的认证协议:基本认证和摘要认证
认证的四个步骤:
请求: 客户端发起一条请求;第一条请求没有认证消息;
质询: 服务器对客户端进行质询;返回一条401 Unauthorized响应,并在www-Authenticate首部说明如何以及在哪里进行认证;一般指定对哪个安全域进行认证;
授权:客户端收到401质询,弹出对话框,询问用户名和密码,用户输入用户名和密码后,客户端会用一个冒号将其连接起来,编码成“经过扰码的”Base-64表示形式,然后将其放在Authorization首部中回送;
成功: 服务器对用户名和密码进行解码,验证它们的正确性,然后用一条HTTP 200 OK报文返回所请求的报文;
基本认证的安全缺陷:
这个基础认证并不安全,因为每次传输都会带上认证信息,并且是明文的(BASE64是编码,不是加密),因此密码等信息可能会被嗅探器发现。
使用SSL加密信道;使用摘要认证;
IIS开启基础HTTP认证
Tomcat开启基础认证:
在web.xml里,添加以下配置:
<security-constraint>
<web-resource-collection>
<web-resource-name>protected Resource</web-resource-name>
<url-pattern>/BasicVerify/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>test100</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name>
</login-config>
访问某个地址(http://localhost:5566/projectname/BasicVerify/test)时,弹出对话框。
tomcat里本身有个tomcat-users.xml,所以用户名密码啥的,在这个文件里配置。
<tomcat-users>
<role rolename="test100"/>
<user username="test123" password="test123" roles="test100"/>
</tomcat-users>
通过role-name,实现web.xml和tomcat-users.xml里的关联。
登录成功后页面显示如下内容,最下方是解码后的用户名和密码。
accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
accept-language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
user-agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3)
accept-encoding: gzip, deflate
host: 192.168.0.41:8080
connection: Keep-Alive
cookie: JSESSIONID=6AE4989CC03AD16468D2686A717FAE97; jhsessionId=EE8026D614FD04F8CC825E35230DE7CB
authorization: Basic dG9tY2F0OnRvbWNhdA==
--------------------------------------------------------------------------------
tomcat:tomcat
抓包
在chrome里抓不到包,要使用wireshark或者fiddler。
这是使用fiddler抓到的request包:
response包,可以看到头部是一个401:
在response的body里是一个401页面,但是没有显示在浏览器中:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>401 Unauthorized</title>
<style type="text/css">
<!--
BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}
H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}
PRE, TT {border: 1px dotted #525D76}
A {color : black;}A.name {color : black;}
-->
</style>
</head>
参考: https://www.jianshu.com/p/3e2d8ad24fec
https://blog.csdn.net/u014006264/article/details/46813925
https://blog.csdn.net/hnzmdpan/article/details/77941616
https://blog.csdn.net/kongxx/article/details/50911018