IIS 各种身份验证详细测试第1/2页
程序员文章站
2022-06-13 18:58:08
一、 iis的身份验证概述.... 3 1、 匿名访问... 3 2、 集成windows身份验证... 3 2.1. ntlm验证... 3 2.2. kerberos验...
一、 iis的身份验证概述.... 3
1、 匿名访问... 3
2、 集成windows身份验证... 3
2.1. ntlm验证... 3
2.2. kerberos验证... 3
3、 基本身份验证... 4
二、 匿名访问.... 4
三、 windows集成验证.... 5
1、 ntlm验证过程... 5
1.1. 客户端选择ntlm方式... 5
1.2. 服务端返回质询码... 5
1.3. 客户端加密质询码再次发送请求... 5
1.4. 服务端验证客户端用户和密码... 5
2、 kerberos验证过程... 6
2.1. 客户端选择kerberos验证... 6
2.2. 服务端验证身份验证票... 6
3、 客户端和服务器都不在域中... 6
3.1. 客户端用ip地址访问服务... 6
3.1.1. 客户端ie申请页面... 6
3.1.2. 服务端返回无授权回应... 6
3.1.3. 客户端选择ntlm验证,要求输入用户名密码,请求质询码... 7
3.1.4. 服务器返回质询码... 7
3.1.5. 客户端发送使用前面输入账户的密码加密后的质询码... 7
3.1.6. 服务端验证通过,返回资源... 8
3.2. 客户端用机器名访问服务器,登录用户名/口令跟服务器不匹配... 9
3.2.1. 客户端ie申请页面... 9
3.2.2. 服务端返回无授权回应... 9
3.2.3. 客户端选择ntlm验证,请求质询码... 9
3.2.4. 服务器返回质询码... 9
3.2.5. 客户端发送用登陆本机的账户加密后的质询码... 10
3.2.6. 服务端返回无授权回应... 10
3.2.7. 客户端及选选择ntlm验证,要求输入用户名和口令,再次请求质询码... 10
3.2.8. 服务端返回质询码... 11
3.2.9. 客户端发送使用前面输入账户的密码加密后的质询码... 11
3.2.10. 服务端验证通过,返回资源... 11
3.3. 客户端用机器名访问服务器,登录用户名/口令跟服务器匹配... 12
3.3.1. 客户端ie申请页面... 12
3.3.2. 服务端返回无授权回应... 12
3.3.3. 客户端选择ntlm验证,请求质询码... 12
3.3.4. 服务器返回质询码... 13
3.3.5. 客户端发送用登陆本机的账户加密后的质询码... 13
3.3.6. 服务端验证通过,返回资源... 13
4、 客户端和服务器都在同一域中... 14
4.1. 客户端用机ip访问服务器... 14
4.1.1. 客户端ie申请页面... 14
4.1.2. 服务端返回无授权回应... 14
4.1.3. 客户端选择ntlm验证,要求输入用户名密码,请求质询码... 15
4.1.4. 服务器返回质询码... 15
4.1.5. 客户端发送使用前面输入账户的密码加密后的质询码... 15
4.1.6. 服务端验证通过,返回资源... 16
4.2. 客户端用机器名访问服务器,客户端用户以域账户登录... 16
4.2.1. 客户端ie申请页面... 16
4.2.2. 服务端返回无授权回应... 16
4.2.3. 客户端选择kerberos验证,发送验证票到服务端... 17
4.2.4. 服务端验证通过,返回资源... 17
4.3. 客户端用机器名访问服务器,客户端用户以客户端本地用户登录,用户名/口令跟服务器账户不匹配 18
4.3.1. 客户端ie申请页面... 18
4.3.2. 服务端返回无授权回应... 18
4.3.3. 客户端选择ntlm验证,请求质询码... 19
4.3.4. 服务器返回质询码... 19
4.3.5. 客户端发送用登陆本机的账户加密后的质询码... 19
4.3.6. 服务端返回无授权回应... 20
4.3.7. 客户端及选选择ntlm验证,要求输入用户名和口令,再次请求质询码... 20
4.3.8. 服务端返回质询码... 20
4.3.9. 客户端发送使用前面输入账户的密码加密后的质询码... 20
4.3.10. 服务端验证通过,返回资源... 21
4.4. 客户端用机器名访问服务器,客户端用户以客户端本地用户登录,用户名/口令跟服务器账户匹配 21
4.4.1. 客户端ie申请页面... 21
4.4.2. 服务端返回无授权回应... 22
4.4.3. 客户端选择ntlm验证,请求质询码... 22
4.4.4. 服务器返回质询码... 22
4.4.5. 客户端发送用登陆本机的账户加密后的质询码... 22
4.4.6. 服务端验证通过,返回资源... 23
5、 集成验证总结... 23
5.1. 客户端以ip地址访问服务器... 23
5.2. 服务器在域,客户端以域帐号登陆... 24
5.3. 其他情况ie都选择采用ntlm验证方式。... 24
四、 基本身份验证.... 24
1、 客户端ie申请页面... 24
2、 服务端返回无授权回应,并告知客户端要求基本身份验证... 24
3、 客户端弹出对话框要求输入用户名和密码... 25
4、 服务端验证通过,返回资源... 25
一、 iis的身份验证概述
iis具有身份验证功能,可以有以下几种验证方式:
1、 匿名访问
这种方式不验证访问用户的身份,客户端不需要提供任何身份验证的凭据,服务端把这样的访问作为匿名的访问,并把这样的访问用户都映射到一个服务端的账户,一般为iuser_machine这个用户,可以修改映射到的用户:
2、 集成windows身份验证
这种验证方式里面也分为两种情况
2.1.
ntlm
验证
这种验证方式需要把用户的用户名和密码传送到服务端,服务端验证用户名和密码是否和服务器的此用户的密码一致。用户名用明码传送,但是密码经过处理后派生出一个8字节的key加密质询码后传送。
2.2.
kerberos
验证
这种验证方式只把客户端访问iis的验证票发送到iis服务器,iis收到这个票据就能确定客户端的身份,不需要传送用户的密码。需要kerberos验证的用户一定是域用户。
每一个登录用户在登录被验证后都会被域中的验证服务器生成一个票据授权票(tgt)作为这个用户访问其他服务所要验证票的凭证(这是为了实现一次登录就能访问域中所有需要验证的资源的所谓单点登录sso功能),而访问iis服务器的验证票是通过此用户的票据授权票(tgt)向iis获取的。之后此客户访问此iis都使用这个验证票。同样访问其他需要验证的服务也是凭这个tgt获取该服务的验证票。
下面是kerberos比较详细的原理。
kerberos原理介绍:
工作站端运行着一个票据授权的服务,叫kinit,专门用做工作站同认证服务器kerberos间的身份认证的服务。
1. 用户开始登录,输入用户名,验证服务器收到用户名,在用户数据库中查找这个用户,结果发现了这个用户。
2. 验证服务器生成一个验证服务器跟这个登录用户之间共享的一个会话口令(session key),这个口令只有验证服务器跟这个登录用户之间使用,用来做相互验证对方使用。同时验证服务器给这个登录用户生成一个票据授权票(ticket-granting ticket),工作站以后就可以凭这个票据授权票来向验证服务器请求其他的票据,而不用再次验证自己的身份了。验证服务器把{ session key + ticket-granting ticket }用登录用户的口令加密后发回到工作站。
3. 工作站用自己的口令解密验证服务器返回的数据包,如果解密正确则验证成功。解密后能够获得登录用户与验证服务器共享的session key和一张ticket-granting ticket。
到此,登录用户没有在网络上发送口令,通过验证服务器使用用户口令加密验证授权票的方法验证了用户,用户跟验证服务器之间建立了关系,在工作站上也保存来相应的身份证明,以后要是用网络中的其他服务,可以通过这个身份证明向验证服务器申请相应服务器的服务票,来获得相应服务身份验证。
4. 如果用户第一次访问iis服务器,工作站的kinit查看本机上没有访问iis服务器的验证票,于是kinit会向验证服务器发出请求,请求访问iis服务的验证票。kinit先要生成一个验证器,验证器是这样的:{用户名:工作站地址}用跟验证服务器间的session key加密。kinit将验证器、票据授权票、你的名字、你的工作站地址、iis服务名字发送的验证服务器,验证服务器验证验证授权票真实有效,然后用跟你共享的session key解开验证器,获取其中的用户名和地址,与发送这个请求的用户和地址比较,如果相符,说明验证通过,这个请求合法。
5. 验证服务器先生成这个用户跟iis服务器之间的session key会话口令,之后根据用户请求生成iis服务器的验证票,是这个样子的:{会话口令:用户名:用户机器地址:服务名:有效期:时间戳},这个验证票用iis服务器的密码(验证服务器知道所有授权服务的密码)进行加密形成最终的验证票。最后,验证服务器{会话口令+加好密的验证票}用用户口令加密后发送给用户。
6. 工作站收到验证服务器返回的数据包,用自己的口令解密,获得跟iis服务器的session key和iis服务器的验证票。
7. 工作站kinit同样要生成一个验证器,验证器是这样的:{用户名:工作站地址}用跟iis服务器间的session key加密。将验证器和iis验证票一起发送到iis服务器。
8. iis服务器先用自己的服务器密码解开iis验证票,如果解密成功,说明此验证票真实有效,然后查看此验证票是否在有效期内,在有效期内,用验证票中带的会话口令去解密验证器,获得其中的用户名和工作站地址,如果跟验证票中的用户名和地址相符则说明发送此验证票的用户就是验证票的所有者,从而验证本次请求有效。
3、 基本身份验证
这种验证方式完全是把用户名和明文用明文(经过base64编码,但是base64编码不是加密的,经过转换就能转换成原始的明文)传送到服务端验证。服务器直接验证服务器本地是否用用户跟客户端提供的用户名和密码相匹配的,如果有则通过验证。
二、 匿名访问
服务端iis设置了允许匿名访问后,在收到客户端的资源请求后,不需要经过身份验证,直接把请求的资源返回给客户端。
get /iisstart.htm http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
if-modified-since: fri, 21 feb 2003 12:15:52 gmt
if-none-match: "0ce1f9a2d9c21:d87"
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; infopath.1; .net clr 2.0.50727; maxthon 2.0)
host: 192.168.100.5
connection: keep-alive
http/1.1 200 ok
content-length: 1193
content-type: text/html
last-modified: fri, 21 feb 2003 12:15:52 gmt
accept-ranges: bytes
etag: "0ce1f9a2d9c21:d8b"
server: microsoft-iis/6.0
microsoftofficewebserver: 5.0_pub
x-powered-by: asp.net
date: mon, 12 nov 2007 07:29:40 gmt
三、 windows集成验证
集成 windows 身份验证可以使用 ntlm 或 kerberos v5 身份验证,当 internet explorer 试图设为集成验证的iis的资源时,iis 发送两个 www 身份验证头,negotiate 和 ntlm。
客户端ie认识negotiate头,将选择negotiate头,之后ie可以选择ntlm 或 kerberos两种验证方式。
如果客户端不认识negotiate头,只能选择ntlm头,就只能使用ntlm验证方式。
现在ie使用的版本一般都在5.0以上,所以现在可以认为ie客户端都能识别negotiate 头。
所以本文只考虑ie接受negotiate头,分别使用ntlm 或 kerberos两种验证的情况。
1、 ntlm验证过程
1.1.
客户端选择
ntlm
方式
如果ie选择了ntlm验证,ie就会在发送到iis的请求中加入一个authorization: negotiate头,内容为:
authorization: negotiate ntlmsspxxxxxxxxxxxxxxxxx
蓝色部分在实际中是经过base64编码的,其中“ntlmssp”表示是ntlm验证的请求,后面的“xxxxxxxx”部分是二进制的数据,告诉服务器,客户端现在选择了ntlm验证,请服务器发送质询码给客户端。
1.2.
服务端返回质询码
服务器在返回无授权访问的http回应的头部加入authorization: negotiate头,内容为:
authorization: negotiate ntlmsspxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
服务器返回的“xxxxxxxx”部分中含有一个八字节的质询码。
1.3.
客户端加密质询码再次发送请求
客户端使用客户端帐号的密码派生出来的8字节deskey使用des算法加密收到的质询码。连同客户端帐号的用户名发送到服务端,形式还是这样:
authorization: negotiate ntlmsspxxxxxxxxxxxxxxxxx
这里的“xxxxxxx”部分包含了加密后的质询码和客户端用户名,用户名在其中以明码形式存在。
1.4.
服务端验证客户端用户和密码
服务端收到用户名后,先查验本机是否有这个用户,如果没有直接返回没有授权的http回应。
如果有这个用户,就用这个用户的密码派生出来的8字节deskey使用des算法加密发给客户端的那个8字节的质询码,然后跟收到客户端发送来的加密后的质询码比较,如果不相同,表示客户端输入密码不正确看,返回没有授权的http回应;如果相同,就表示客户端输入这个用户的密码正确,验证通过,返回客户端请求的资源。
2、 kerberos验证过程
2.1.
客户端选择
kerberos
验证
如果客户端选择了kerberos验证,客户端直接在请求头中加入authorization: negotiate头,内容为:
authorization: negotiate xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
其中“xxxxxxxxxx”包含了客户端登录用户的身份验证票(登录时域中的票据服务器发放的标识此登录用户身份的票据,其中不包含用户的密码)。
2.2.
服务端验证身份验证票
服务器验证用户验证票,如果有效的票据,服务端能据此获得用户的用户名,并验证用户的有效性。验证通过后,服务端返回客户端请求的资源。
但是客户端ie何时选择ntlm 、合适选择kerberos呢?下面通过一系列的测试来找出答案。
分服务器和客户端在域不在域两种情况测试。
3、 客户端和服务器都不在域中
测试环境为服务器和客户端机器在同一个局域网中,但是都不在域中。客户端ie请求服务端iis的一个页面default.aspx。
iis服务端设置:
l 不启用匿名访问
l 只启用集成windows身份验证
这个环境下又分为下面几种情况:
3.1.
客户端用
ip
地址访问服务
3.1.1. 客户端ie申请页面
客户端ie浏览器的地址栏上输入要访问的url,就会向服务端发送一个get请求:
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: 192.168.1.13:81
connection: keep-alive
3.1.2. 服务端返回无授权回应
服务端设置了禁用匿名访问,只允许windows验证,所以服务端返回了无授权回应:
http/1.1 401 unauthorized
返回的http头中还包括的:
www-authenticate: negotiate
www-authenticate: ntlm
这两个头表示服务端只接受集成windows验证方式
http/1.1 401 unauthorized
content-length: 1327
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: sun, 11 nov 2007 12:28:29 gmt
3.1.3. 客户端选择ntlm验证,要求输入用户名密码,请求质询码
客户端通过authorization: negotiate ntlmsspxxxx 头告诉服务器,客户端要求ntlm验证,请求服务端发送质询码。
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: 192.168.1.13:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaad3==
3.1.4. 服务器返回质询码
服务端收到客户端的请求,发送一个八字节的质询码。
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqii7rzphzu6meaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: sun, 11 nov 2007 12:29:44 gmt
3.1.5. 客户端发送使用前面输入账户的密码加密后的质询码
客户端ie收到质询码后,使用根据一定的规则从登录用户密码派生出的8字节的key对质询码进行des加密,加密后的质询码和用户名明码连同页面请求一起发送到服务端。
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: 192.168.1.13:81
connection: keep-alive
authorization: negotiate tlrmtvntuaadaaaagaayai4aaaayabgapgaaabgagabiaaaaggaaagaaaaauabqaegaaaaaaaac+aaaabykioguczg4aaaapmqa5adialgaxadyaoaauadealgaxadmayqbkag0aaqbuagkacwb0ahiayqb0ag8acgbxaekatgayadaamaazac0auabdal0ammkkemwlaaaaaaaaaaaaaaaaaaaaafnd1boc0kthz0tbnfxn3z4w9/nilu1ctw==
3.1.6. 服务端验证通过,返回资源
服务端收到用户名和加密后的质询码后,根据用户名查找服务器上此用户的密码,按照客户端同样的方法加密质询码,然后跟收到客户端返回的质询码,如果一致,则说明用户名和密码都一致,验证通过,返回客户端ie请求资源。如果不对,再次返回无授权http回应。
http/1.1 200 ok
date: sun, 11 nov 2007 12:29:44 gmt
server: microsoft-iis/6.0
x-powered-by: asp.net
x-aspnet-version: 2.0.50727
cache-control: private
content-type: text/html; charset=utf-8
content-length: 522
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
.untitled page
</title></head>
<body>
<form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__viewstate" id="__viewstate" value="/wepdwujnzgzndmwntmzzgtcefu2sz1mlsbxizduexomiyz20q==" />
</div>
<div>
this is a simple page!</div>
</form>
</body>
</html>
3.2.
客户端用机器名访问服务器,登录用户名
/
口令跟服务器不匹配
这种情况,客户端用服务器名访问服务器,但是客户端登录系统的用户跟服务器上的用户名和密码不匹配,也就是要么服务器上没这个用户,要么就是服务器这个用户的密码跟客户端这个用户的密码不一样。
3.2.1. 客户端ie申请页面
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
3.2.2. 服务端返回无授权回应
服务端不允许匿名访问,服务端返回需要集成验证的的http头。
http/1.1 401 unauthorized
content-length: 1327
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:36 gmt
3.2.3. 客户端选择ntlm验证,请求质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaadw==
3.2.4. 服务器返回质询码
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqikemftrqx0quaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:36 gmt
3.2.5. 客户端发送用登陆本机的账户加密后的质询码
客户端ie首先用本机登录用户的密码派生的key加密质询码,然后连同用户名一起发送到服务端验证。
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaadaaaagaayaioaaaayabgaogaaabqafabiaaaaggaaafwaaaauabqadgaaaaaaaac6aaaabykioguczg4aaaapvwbjae4amgawadaamwatafaaqwbbagqabqbpag4aaqbzahqacgbhahqabwbyafcasqboadiamaawadmalqbqaemawo4jxecjeuwaaaaaaaaaaaaaaaaaaaaa2/kscwhi0mmac6w4omszjbrryrs2ngux
3.2.6. 服务端返回无授权回应
客户端本机登录的用户名和密码跟服务器端没有匹配的,所以验证在服务端没有通过,服务端返回无授权的回应。
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:36 gmt
3.2.7. 客户端及选选择ntlm验证,要求输入用户名和口令,再次请求质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaadw==
3.2.8. 服务端返回质询码
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqi3ghim9qd6tuaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:45 gmt
3.2.9. 客户端发送使用前面输入账户的密码加密后的质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaadaaaagaayaigaaaayabgaoaaaabiaegbiaaaaggaaafoaaaauabqadaaaaaaaaac4aaaabykioguczg4aaaapqgbjafoavabbaewaswbsadiayqbkag0aaqbuagkacwb0ahiayqb0ag8acgbxaekatgayadaamaazac0auabdakeymtcyzwkjaaaaaaaaaaaaaaaaaaaaaexqwtipbr+izohndmnoppu1b9pp7qbpla==
3.2.10. 服务端验证通过,返回资源
http/1.1 200 ok
date: wed, 14 nov 2007 12:38:45 gmt
server: microsoft-iis/6.0
x-powered-by: asp.net
x-aspnet-version: 2.0.50727
cache-control: private
content-type: text/html; charset=utf-8
content-length: 522
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
.untitled page
</title></head>
<body>
<form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__viewstate" id="__viewstate" value="/wepdwujnzgzndmwntmzzgtcefu2sz1mlsbxizduexomiyz20q==" />
</div>
<div>
this is a simple page!</div>
</form>
</body>
</html>
3.3.
客户端用机器名访问服务器
,登录用户名
/
口令跟服务器匹配
这种情况,客户端用服务器名访问服务器,而且客户端登录系统的用户正好在服务器上有个同名同密码的用户。
3.3.1. 客户端ie申请页面
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
3.3.2. 服务端返回无授权回应
同样,服务端不允许匿名访问,服务端返回需要集成验证的的http头。
http/1.1 401 unauthorized
content-length: 1327
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: wed, 14 nov 2007 12:35:41 gmt
3.3.3. 客户端选择ntlm验证,请求质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaadw==
3.3.4. 服务器返回质询码
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqiswltzjlmelaaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: wed, 14 nov 2007 12:35:41 gmt
1、 匿名访问... 3
2、 集成windows身份验证... 3
2.1. ntlm验证... 3
2.2. kerberos验证... 3
3、 基本身份验证... 4
二、 匿名访问.... 4
三、 windows集成验证.... 5
1、 ntlm验证过程... 5
1.1. 客户端选择ntlm方式... 5
1.2. 服务端返回质询码... 5
1.3. 客户端加密质询码再次发送请求... 5
1.4. 服务端验证客户端用户和密码... 5
2、 kerberos验证过程... 6
2.1. 客户端选择kerberos验证... 6
2.2. 服务端验证身份验证票... 6
3、 客户端和服务器都不在域中... 6
3.1. 客户端用ip地址访问服务... 6
3.1.1. 客户端ie申请页面... 6
3.1.2. 服务端返回无授权回应... 6
3.1.3. 客户端选择ntlm验证,要求输入用户名密码,请求质询码... 7
3.1.4. 服务器返回质询码... 7
3.1.5. 客户端发送使用前面输入账户的密码加密后的质询码... 7
3.1.6. 服务端验证通过,返回资源... 8
3.2. 客户端用机器名访问服务器,登录用户名/口令跟服务器不匹配... 9
3.2.1. 客户端ie申请页面... 9
3.2.2. 服务端返回无授权回应... 9
3.2.3. 客户端选择ntlm验证,请求质询码... 9
3.2.4. 服务器返回质询码... 9
3.2.5. 客户端发送用登陆本机的账户加密后的质询码... 10
3.2.6. 服务端返回无授权回应... 10
3.2.7. 客户端及选选择ntlm验证,要求输入用户名和口令,再次请求质询码... 10
3.2.8. 服务端返回质询码... 11
3.2.9. 客户端发送使用前面输入账户的密码加密后的质询码... 11
3.2.10. 服务端验证通过,返回资源... 11
3.3. 客户端用机器名访问服务器,登录用户名/口令跟服务器匹配... 12
3.3.1. 客户端ie申请页面... 12
3.3.2. 服务端返回无授权回应... 12
3.3.3. 客户端选择ntlm验证,请求质询码... 12
3.3.4. 服务器返回质询码... 13
3.3.5. 客户端发送用登陆本机的账户加密后的质询码... 13
3.3.6. 服务端验证通过,返回资源... 13
4、 客户端和服务器都在同一域中... 14
4.1. 客户端用机ip访问服务器... 14
4.1.1. 客户端ie申请页面... 14
4.1.2. 服务端返回无授权回应... 14
4.1.3. 客户端选择ntlm验证,要求输入用户名密码,请求质询码... 15
4.1.4. 服务器返回质询码... 15
4.1.5. 客户端发送使用前面输入账户的密码加密后的质询码... 15
4.1.6. 服务端验证通过,返回资源... 16
4.2. 客户端用机器名访问服务器,客户端用户以域账户登录... 16
4.2.1. 客户端ie申请页面... 16
4.2.2. 服务端返回无授权回应... 16
4.2.3. 客户端选择kerberos验证,发送验证票到服务端... 17
4.2.4. 服务端验证通过,返回资源... 17
4.3. 客户端用机器名访问服务器,客户端用户以客户端本地用户登录,用户名/口令跟服务器账户不匹配 18
4.3.1. 客户端ie申请页面... 18
4.3.2. 服务端返回无授权回应... 18
4.3.3. 客户端选择ntlm验证,请求质询码... 19
4.3.4. 服务器返回质询码... 19
4.3.5. 客户端发送用登陆本机的账户加密后的质询码... 19
4.3.6. 服务端返回无授权回应... 20
4.3.7. 客户端及选选择ntlm验证,要求输入用户名和口令,再次请求质询码... 20
4.3.8. 服务端返回质询码... 20
4.3.9. 客户端发送使用前面输入账户的密码加密后的质询码... 20
4.3.10. 服务端验证通过,返回资源... 21
4.4. 客户端用机器名访问服务器,客户端用户以客户端本地用户登录,用户名/口令跟服务器账户匹配 21
4.4.1. 客户端ie申请页面... 21
4.4.2. 服务端返回无授权回应... 22
4.4.3. 客户端选择ntlm验证,请求质询码... 22
4.4.4. 服务器返回质询码... 22
4.4.5. 客户端发送用登陆本机的账户加密后的质询码... 22
4.4.6. 服务端验证通过,返回资源... 23
5、 集成验证总结... 23
5.1. 客户端以ip地址访问服务器... 23
5.2. 服务器在域,客户端以域帐号登陆... 24
5.3. 其他情况ie都选择采用ntlm验证方式。... 24
四、 基本身份验证.... 24
1、 客户端ie申请页面... 24
2、 服务端返回无授权回应,并告知客户端要求基本身份验证... 24
3、 客户端弹出对话框要求输入用户名和密码... 25
4、 服务端验证通过,返回资源... 25
一、 iis的身份验证概述
iis具有身份验证功能,可以有以下几种验证方式:
1、 匿名访问
这种方式不验证访问用户的身份,客户端不需要提供任何身份验证的凭据,服务端把这样的访问作为匿名的访问,并把这样的访问用户都映射到一个服务端的账户,一般为iuser_machine这个用户,可以修改映射到的用户:
2、 集成windows身份验证
这种验证方式里面也分为两种情况
2.1.
ntlm
验证
这种验证方式需要把用户的用户名和密码传送到服务端,服务端验证用户名和密码是否和服务器的此用户的密码一致。用户名用明码传送,但是密码经过处理后派生出一个8字节的key加密质询码后传送。
2.2.
kerberos
验证
这种验证方式只把客户端访问iis的验证票发送到iis服务器,iis收到这个票据就能确定客户端的身份,不需要传送用户的密码。需要kerberos验证的用户一定是域用户。
每一个登录用户在登录被验证后都会被域中的验证服务器生成一个票据授权票(tgt)作为这个用户访问其他服务所要验证票的凭证(这是为了实现一次登录就能访问域中所有需要验证的资源的所谓单点登录sso功能),而访问iis服务器的验证票是通过此用户的票据授权票(tgt)向iis获取的。之后此客户访问此iis都使用这个验证票。同样访问其他需要验证的服务也是凭这个tgt获取该服务的验证票。
下面是kerberos比较详细的原理。
kerberos原理介绍:
工作站端运行着一个票据授权的服务,叫kinit,专门用做工作站同认证服务器kerberos间的身份认证的服务。
1. 用户开始登录,输入用户名,验证服务器收到用户名,在用户数据库中查找这个用户,结果发现了这个用户。
2. 验证服务器生成一个验证服务器跟这个登录用户之间共享的一个会话口令(session key),这个口令只有验证服务器跟这个登录用户之间使用,用来做相互验证对方使用。同时验证服务器给这个登录用户生成一个票据授权票(ticket-granting ticket),工作站以后就可以凭这个票据授权票来向验证服务器请求其他的票据,而不用再次验证自己的身份了。验证服务器把{ session key + ticket-granting ticket }用登录用户的口令加密后发回到工作站。
3. 工作站用自己的口令解密验证服务器返回的数据包,如果解密正确则验证成功。解密后能够获得登录用户与验证服务器共享的session key和一张ticket-granting ticket。
到此,登录用户没有在网络上发送口令,通过验证服务器使用用户口令加密验证授权票的方法验证了用户,用户跟验证服务器之间建立了关系,在工作站上也保存来相应的身份证明,以后要是用网络中的其他服务,可以通过这个身份证明向验证服务器申请相应服务器的服务票,来获得相应服务身份验证。
4. 如果用户第一次访问iis服务器,工作站的kinit查看本机上没有访问iis服务器的验证票,于是kinit会向验证服务器发出请求,请求访问iis服务的验证票。kinit先要生成一个验证器,验证器是这样的:{用户名:工作站地址}用跟验证服务器间的session key加密。kinit将验证器、票据授权票、你的名字、你的工作站地址、iis服务名字发送的验证服务器,验证服务器验证验证授权票真实有效,然后用跟你共享的session key解开验证器,获取其中的用户名和地址,与发送这个请求的用户和地址比较,如果相符,说明验证通过,这个请求合法。
5. 验证服务器先生成这个用户跟iis服务器之间的session key会话口令,之后根据用户请求生成iis服务器的验证票,是这个样子的:{会话口令:用户名:用户机器地址:服务名:有效期:时间戳},这个验证票用iis服务器的密码(验证服务器知道所有授权服务的密码)进行加密形成最终的验证票。最后,验证服务器{会话口令+加好密的验证票}用用户口令加密后发送给用户。
6. 工作站收到验证服务器返回的数据包,用自己的口令解密,获得跟iis服务器的session key和iis服务器的验证票。
7. 工作站kinit同样要生成一个验证器,验证器是这样的:{用户名:工作站地址}用跟iis服务器间的session key加密。将验证器和iis验证票一起发送到iis服务器。
8. iis服务器先用自己的服务器密码解开iis验证票,如果解密成功,说明此验证票真实有效,然后查看此验证票是否在有效期内,在有效期内,用验证票中带的会话口令去解密验证器,获得其中的用户名和工作站地址,如果跟验证票中的用户名和地址相符则说明发送此验证票的用户就是验证票的所有者,从而验证本次请求有效。
3、 基本身份验证
这种验证方式完全是把用户名和明文用明文(经过base64编码,但是base64编码不是加密的,经过转换就能转换成原始的明文)传送到服务端验证。服务器直接验证服务器本地是否用用户跟客户端提供的用户名和密码相匹配的,如果有则通过验证。
二、 匿名访问
服务端iis设置了允许匿名访问后,在收到客户端的资源请求后,不需要经过身份验证,直接把请求的资源返回给客户端。
get /iisstart.htm http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
if-modified-since: fri, 21 feb 2003 12:15:52 gmt
if-none-match: "0ce1f9a2d9c21:d87"
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; infopath.1; .net clr 2.0.50727; maxthon 2.0)
host: 192.168.100.5
connection: keep-alive
http/1.1 200 ok
content-length: 1193
content-type: text/html
last-modified: fri, 21 feb 2003 12:15:52 gmt
accept-ranges: bytes
etag: "0ce1f9a2d9c21:d8b"
server: microsoft-iis/6.0
microsoftofficewebserver: 5.0_pub
x-powered-by: asp.net
date: mon, 12 nov 2007 07:29:40 gmt
三、 windows集成验证
集成 windows 身份验证可以使用 ntlm 或 kerberos v5 身份验证,当 internet explorer 试图设为集成验证的iis的资源时,iis 发送两个 www 身份验证头,negotiate 和 ntlm。
客户端ie认识negotiate头,将选择negotiate头,之后ie可以选择ntlm 或 kerberos两种验证方式。
如果客户端不认识negotiate头,只能选择ntlm头,就只能使用ntlm验证方式。
现在ie使用的版本一般都在5.0以上,所以现在可以认为ie客户端都能识别negotiate 头。
所以本文只考虑ie接受negotiate头,分别使用ntlm 或 kerberos两种验证的情况。
1、 ntlm验证过程
1.1.
客户端选择
ntlm
方式
如果ie选择了ntlm验证,ie就会在发送到iis的请求中加入一个authorization: negotiate头,内容为:
authorization: negotiate ntlmsspxxxxxxxxxxxxxxxxx
蓝色部分在实际中是经过base64编码的,其中“ntlmssp”表示是ntlm验证的请求,后面的“xxxxxxxx”部分是二进制的数据,告诉服务器,客户端现在选择了ntlm验证,请服务器发送质询码给客户端。
1.2.
服务端返回质询码
服务器在返回无授权访问的http回应的头部加入authorization: negotiate头,内容为:
authorization: negotiate ntlmsspxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
服务器返回的“xxxxxxxx”部分中含有一个八字节的质询码。
1.3.
客户端加密质询码再次发送请求
客户端使用客户端帐号的密码派生出来的8字节deskey使用des算法加密收到的质询码。连同客户端帐号的用户名发送到服务端,形式还是这样:
authorization: negotiate ntlmsspxxxxxxxxxxxxxxxxx
这里的“xxxxxxx”部分包含了加密后的质询码和客户端用户名,用户名在其中以明码形式存在。
1.4.
服务端验证客户端用户和密码
服务端收到用户名后,先查验本机是否有这个用户,如果没有直接返回没有授权的http回应。
如果有这个用户,就用这个用户的密码派生出来的8字节deskey使用des算法加密发给客户端的那个8字节的质询码,然后跟收到客户端发送来的加密后的质询码比较,如果不相同,表示客户端输入密码不正确看,返回没有授权的http回应;如果相同,就表示客户端输入这个用户的密码正确,验证通过,返回客户端请求的资源。
2、 kerberos验证过程
2.1.
客户端选择
kerberos
验证
如果客户端选择了kerberos验证,客户端直接在请求头中加入authorization: negotiate头,内容为:
authorization: negotiate xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
其中“xxxxxxxxxx”包含了客户端登录用户的身份验证票(登录时域中的票据服务器发放的标识此登录用户身份的票据,其中不包含用户的密码)。
2.2.
服务端验证身份验证票
服务器验证用户验证票,如果有效的票据,服务端能据此获得用户的用户名,并验证用户的有效性。验证通过后,服务端返回客户端请求的资源。
但是客户端ie何时选择ntlm 、合适选择kerberos呢?下面通过一系列的测试来找出答案。
分服务器和客户端在域不在域两种情况测试。
3、 客户端和服务器都不在域中
测试环境为服务器和客户端机器在同一个局域网中,但是都不在域中。客户端ie请求服务端iis的一个页面default.aspx。
iis服务端设置:
l 不启用匿名访问
l 只启用集成windows身份验证
这个环境下又分为下面几种情况:
3.1.
客户端用
ip
地址访问服务
3.1.1. 客户端ie申请页面
客户端ie浏览器的地址栏上输入要访问的url,就会向服务端发送一个get请求:
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: 192.168.1.13:81
connection: keep-alive
3.1.2. 服务端返回无授权回应
服务端设置了禁用匿名访问,只允许windows验证,所以服务端返回了无授权回应:
http/1.1 401 unauthorized
返回的http头中还包括的:
www-authenticate: negotiate
www-authenticate: ntlm
这两个头表示服务端只接受集成windows验证方式
http/1.1 401 unauthorized
content-length: 1327
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: sun, 11 nov 2007 12:28:29 gmt
3.1.3. 客户端选择ntlm验证,要求输入用户名密码,请求质询码
客户端通过authorization: negotiate ntlmsspxxxx 头告诉服务器,客户端要求ntlm验证,请求服务端发送质询码。
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: 192.168.1.13:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaad3==
3.1.4. 服务器返回质询码
服务端收到客户端的请求,发送一个八字节的质询码。
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqii7rzphzu6meaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: sun, 11 nov 2007 12:29:44 gmt
3.1.5. 客户端发送使用前面输入账户的密码加密后的质询码
客户端ie收到质询码后,使用根据一定的规则从登录用户密码派生出的8字节的key对质询码进行des加密,加密后的质询码和用户名明码连同页面请求一起发送到服务端。
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: 192.168.1.13:81
connection: keep-alive
authorization: negotiate tlrmtvntuaadaaaagaayai4aaaayabgapgaaabgagabiaaaaggaaagaaaaauabqaegaaaaaaaac+aaaabykioguczg4aaaapmqa5adialgaxadyaoaauadealgaxadmayqbkag0aaqbuagkacwb0ahiayqb0ag8acgbxaekatgayadaamaazac0auabdal0ammkkemwlaaaaaaaaaaaaaaaaaaaaafnd1boc0kthz0tbnfxn3z4w9/nilu1ctw==
3.1.6. 服务端验证通过,返回资源
服务端收到用户名和加密后的质询码后,根据用户名查找服务器上此用户的密码,按照客户端同样的方法加密质询码,然后跟收到客户端返回的质询码,如果一致,则说明用户名和密码都一致,验证通过,返回客户端ie请求资源。如果不对,再次返回无授权http回应。
http/1.1 200 ok
date: sun, 11 nov 2007 12:29:44 gmt
server: microsoft-iis/6.0
x-powered-by: asp.net
x-aspnet-version: 2.0.50727
cache-control: private
content-type: text/html; charset=utf-8
content-length: 522
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
.untitled page
</title></head>
<body>
<form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__viewstate" id="__viewstate" value="/wepdwujnzgzndmwntmzzgtcefu2sz1mlsbxizduexomiyz20q==" />
</div>
<div>
this is a simple page!</div>
</form>
</body>
</html>
3.2.
客户端用机器名访问服务器,登录用户名
/
口令跟服务器不匹配
这种情况,客户端用服务器名访问服务器,但是客户端登录系统的用户跟服务器上的用户名和密码不匹配,也就是要么服务器上没这个用户,要么就是服务器这个用户的密码跟客户端这个用户的密码不一样。
3.2.1. 客户端ie申请页面
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
3.2.2. 服务端返回无授权回应
服务端不允许匿名访问,服务端返回需要集成验证的的http头。
http/1.1 401 unauthorized
content-length: 1327
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:36 gmt
3.2.3. 客户端选择ntlm验证,请求质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaadw==
3.2.4. 服务器返回质询码
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqikemftrqx0quaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:36 gmt
3.2.5. 客户端发送用登陆本机的账户加密后的质询码
客户端ie首先用本机登录用户的密码派生的key加密质询码,然后连同用户名一起发送到服务端验证。
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaadaaaagaayaioaaaayabgaogaaabqafabiaaaaggaaafwaaaauabqadgaaaaaaaac6aaaabykioguczg4aaaapvwbjae4amgawadaamwatafaaqwbbagqabqbpag4aaqbzahqacgbhahqabwbyafcasqboadiamaawadmalqbqaemawo4jxecjeuwaaaaaaaaaaaaaaaaaaaaa2/kscwhi0mmac6w4omszjbrryrs2ngux
3.2.6. 服务端返回无授权回应
客户端本机登录的用户名和密码跟服务器端没有匹配的,所以验证在服务端没有通过,服务端返回无授权的回应。
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:36 gmt
3.2.7. 客户端及选选择ntlm验证,要求输入用户名和口令,再次请求质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaadw==
3.2.8. 服务端返回质询码
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqi3ghim9qd6tuaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: wed, 14 nov 2007 12:38:45 gmt
3.2.9. 客户端发送使用前面输入账户的密码加密后的质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaadaaaagaayaigaaaayabgaoaaaabiaegbiaaaaggaaafoaaaauabqadaaaaaaaaac4aaaabykioguczg4aaaapqgbjafoavabbaewaswbsadiayqbkag0aaqbuagkacwb0ahiayqb0ag8acgbxaekatgayadaamaazac0auabdakeymtcyzwkjaaaaaaaaaaaaaaaaaaaaaexqwtipbr+izohndmnoppu1b9pp7qbpla==
3.2.10. 服务端验证通过,返回资源
http/1.1 200 ok
date: wed, 14 nov 2007 12:38:45 gmt
server: microsoft-iis/6.0
x-powered-by: asp.net
x-aspnet-version: 2.0.50727
cache-control: private
content-type: text/html; charset=utf-8
content-length: 522
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
.untitled page
</title></head>
<body>
<form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__viewstate" id="__viewstate" value="/wepdwujnzgzndmwntmzzgtcefu2sz1mlsbxizduexomiyz20q==" />
</div>
<div>
this is a simple page!</div>
</form>
</body>
</html>
3.3.
客户端用机器名访问服务器
,登录用户名
/
口令跟服务器匹配
这种情况,客户端用服务器名访问服务器,而且客户端登录系统的用户正好在服务器上有个同名同密码的用户。
3.3.1. 客户端ie申请页面
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
3.3.2. 服务端返回无授权回应
同样,服务端不允许匿名访问,服务端返回需要集成验证的的http头。
http/1.1 401 unauthorized
content-length: 1327
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate
www-authenticate: ntlm
x-powered-by: asp.net
date: wed, 14 nov 2007 12:35:41 gmt
3.3.3. 客户端选择ntlm验证,请求质询码
get /wstest/default.aspx http/1.1
accept: */*
accept-language: zh-cn
ua-cpu: x86
accept-encoding: gzip, deflate
user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.2; sv1; .net clr 1.1.4322; .net clr 2.0.50727; infopath.1; maxthon 2.0)
host: biztalkr2:81
connection: keep-alive
authorization: negotiate tlrmtvntuaabaaaab4iiogaaaaaaaaaaaaaaaaaaaaafas4oaaaadw==
3.3.4. 服务器返回质询码
http/1.1 401 unauthorized
content-length: 1251
content-type: text/html
server: microsoft-iis/6.0
www-authenticate: negotiate tlrmtvntuaacaaaaegasadgaaaafgoqiswltzjlmelaaaaaaaaaaafwaxabkaaaabqlodgaaaa9caekawgbuaeeatablafiamgacabiaqgbjafoavabbaewaswbsadiaaqasaeiasqbaafqaqqbmaesaugayaaqaegbiagkaegb0ageababrafiamgadabiaygbpahoadabhagwaawbsadiaaaaaaa==
x-powered-by: asp.net
date: wed, 14 nov 2007 12:35:41 gmt
1
推荐阅读