尝试使用自定义基本验证模块similar to this时出现问题。客户端使用HttpWebRequest
类。通过SSL发送请求时无法发布文件数据
客户端运行下面的代码:
void uploadFile(string serverUrl, string filePath)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.
Create(serverUrl);
CredentialCache cache = new CredentialCache();
cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("User", "pass"));
request.Credentials = cache;
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.Timeout = 60000;
request.KeepAlive = true;
using(BinaryReader reader = new BinaryReader(
File.OpenRead(filePath))) {
request.ContentLength = reader.BaseStream.Length;
using(Stream stream = request.GetRequestStream()) {
byte[] buffer = new byte[1024];
while(true) {
int bytesRead = reader.Read(buffer, 0, buffer.Length);
if(bytesRead == 0) {
break;
}
stream.Write(buffer, 0, bytesRead);
}
}
}
HttpWebResponse result = (HttpWebResponse)request.GetResponse();
//handle result - not relevant
}
如果一个URI开始http://
创建请求它工作正常 - 一个请求到达服务器,认证模块传递请求,它回复WWW-Authenticate
,请求重复现在与认证参数,模块验证它,并进一步传递。
如果为从https://
开始的URI创建请求,则不起作用。初始请求获取到模块和模块WWW-Authenticate
void ReplyWithAuthHeader()
{
HttpContext currentContext = HttpContext.Current;
context.Response.StatusCode = 401;
context.Response.AddHeader("WWW-Authenticate",
String.Format("Basic realm=\"{0}\"", "myname.mycompany.com"));
}
的一个例外是在客户机抛出带有“无法将数据写入传输连接回复:一个已建立的连接在主机中的软件放弃机。”文本。
我试图System.Net tracing,发现在客户端发送回来下面的头在初始请求后:
Date: Fri, 04 Feb 2011 12:15:04 GMT
Server: Microsoft-IIS/5.1
X-Powered-By: ASP.NET
而当URI开始http://
客户端收到以下内容:
Content-Length: 1894
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Fri, 04 Feb 2011 12:12:11 GMT
Server: Microsoft-IIS/5.1
WWW-Authenticate: Basic realm="myname.mycompany.com"
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
所以很明显,WWW-Authenticate
响应会被吞噬,并且不会到达客户端。
此外,如果我排除将文件数据写入请求的代码,它也可以进行身份验证。
我该如何解决这个问题?我如何使WWW-Authenticate
响应得到客户端?