三、 基本身份验证
服务端IIS设置为不允许匿名访问,只选择了基本身份验证,客户端使用HttpWebRequest发送一个get请求,请求一个页面。
基本身份验证,客户端直接把用户的用户名和密码简单的转换为base64编码后发送到服务端,属于明码传送,不具安全性。
基本身份验证,HttpWebRequest.Credentials属性只能使用NetworkCredential来传送用户名也密码,CredentialCache.DefaultCredentials不支持基本身份验证。
在服务端只要求基本身份验证的情况下,如果HttpWebRequest.Credentials属性使用的是CredentialCache.DefaultCredentials,当收到服务端返回无授权(要求基本身份验证)回应后,HttpWebRequest直接跑出无授权异常。
客户端用户凭据也是这样:
myHttpWebRequest.Credentials = new NetworkCredential("用户名", "口令");
但是,根据服务端不同的回应,HttpWebRequest会有不同的动作。
看一下整个请求响应过程:
1.1. 第一次HttpWebRequest先以匿名发送http请求
GET /iisstart.htm HTTP/1.1
Host: 2003base
Connection: Keep-Alive
1.2. 服务端返回无授权回应
服务端IIS设置为不允许匿名访问,要求基本身份验证,所以服务端返回无授权回应,同时在http头加了个WWW-Authenticate: Basic realm="2003base" 头,Basic表示要求基本身份验证。
HTTP/1.1 401 Unauthorized
Content-Length: 1327
Content-Type: text/html
Server: Microsoft-IIS/6.0
WWW-Authenticate: Basic realm="2003base"
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
Date: Mon, 26 Nov 2007 08:52:42 GMT
1.3. HttpWebRequest发送base64格式的用户名和密码
HttpWebRequest收到Basic的验证头后,就把NetworkCredential提供的用户名和口令链接起来,转换成base64编码,直接发送到服务端。
Base64编码用户名和密码看上去是这样的:Y2hua2luZzpwYXNzd29yZA==
经过转换后,可以看到用户名和密码是:chnking:password
GET /iisstart.htm HTTP/1.1
Authorization: Basic Y2hua2luZzpwYXNzd29yZA==
Host: 2003base
1.4. 服务器通过验证,返回页面
HTTP/1.1 200 OK
Content-Length: 200
Content-Type: text/html
Last-Modified: Fri, 23 Nov 2007 07:00:18 GMT
Accept-Ranges: bytes
ETag: "6084ba819e2dc81:356"
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
Date: Mon, 26 Nov 2007 08:52:42 GMT
<html>
<head>
<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312">
<title ID=titletext>......</title>
</head>
<body bgcolor=white>
.This is a sample page!
</body>
</html>