我在尝试使用自定义基本身份验证模块similar to this时遇到问题。客户端使用HttpWebRequest
类。
客户端运行以下代码:
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
}
如果为以http://
开头的URI创建请求它可以正常工作 - 请求到达服务器,验证模块传递请求,它回复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
响应发送给客户?
答案 0 :(得分:0)
从服务器返回的http状态代码是什么? 服务器的证书是否有效? 你可以发布堆栈跟踪吗?
尝试在您的客户端禁用防火墙和其他网络工具,如fiddler等。 另请尝试将KeepAlive属性设置为false。