У меня проблемы при попытке использовать пользовательский базовый модуль аутентификации , аналогичный этому . Клиент использует 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
}
Если запрос создан для URI, начинающегося с http://
, он работает нормально - запрос достигает сервера, модуль аутентификации передает запрос, он отвечает WWW-Authenticate
, запрос теперь повторяется с параметрами аутентификации, модуль проверяет его и он проходит дальше.
Если запрос создан для URI, начинающегося с https://
, он не работает. Первоначальный запрос поступает в модуль, и модуль отвечает с 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 и обнаружил, что после отправки первоначального запроса клиент получает следующий заголовок:
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
получил ответ клиенту?