FtpWebRequest игнорирует неверный пароль после предыдущего успешного соединения с использованием правильного пароля


Я столкнулся с проблемой при работе с классом FtpWebRequest в C#.

Когда я пытаюсь загрузить файл на FTP-сервер, используя правильные учетные данные в первый раз, а затем неправильные учетные данные (имя пользователя то же самое, но неправильный пароль) во второй раз, не возникает никаких исключений, и файл по-прежнему загружается на FTP-сервер. Пожалуйста, рассмотрите следующий код:

using System;
using System.Net;

internal class Program
{
    private static void Main(string[] args)
    {
        var uri = new Uri("ftp://ftp.dlptest.com/TestFile.txt");
        var method = WebRequestMethods.Ftp.UploadFile;

        //Here I'm uploading the test file using correct credentials
        var correctCredentials =
            new NetworkCredential("dlpuser@dlptest.com", "fwRhzAnR1vgig8s");
        DoFtpRequest(uri, correctCredentials, method);

        //Here I'm uploading the test file using wrong credentials.
        //I expect some exception to be thrown and the file not being
        //uploaded to the server, neither is the case.
        var wrongCredentials =
            new NetworkCredential("dlpuser@dlptest.com", "WRONG_PASWORD");
        DoFtpRequest(uri, wrongCredentials, method);
    }

    public static FtpWebResponse DoFtpRequest(
        Uri uri, NetworkCredential credentials, string method)
    {
        var request = (FtpWebRequest)WebRequest.Create(uri);
        request.Credentials = credentials;
        request.Method = method;
        return (FtpWebResponse)request.GetResponse();
    }
}

Здесь я использую общедоступный ftp-сервер ftp://ftp.dlptest.com/, который я нашел здесь https://dlptest.com/ftp-test/ который вы можете использовать для тестирования этого кода.

Как вы можете видеть, сначала я пытаюсь загрузить файл с правильными учетными данными, а затем с неправильными учетными данными (используя то же имя пользователя, но меняя пароль). Но файл по-прежнему загружается на сервер. Если я попытаюсь сначала использовать неправильные учетные данные, то возникнет исключение, и все будет работать, как и ожидалось.

Вы знаете, что происходит? Это ошибка фреймворка? Каковы мои варианты решения этой проблемы, потому что она вызывает проблемы с программа, над которой я сейчас работаю?

1 3

1 ответ:

FtpWebRequest использует пул соединений под капотом. Смотрите FTP несколько файлов в C# без восстановления соединения.

Ключами к этому пулу соединений являются только имя хоста, номер порта, имя пользователя и необязательное имя группы соединений.


Ваш второй запрос повторно использует соединение из первого запроса и никогда не использует неверный пароль. Это потому, что эти два запроса используют один и тот же пул соединений, так как они отличаются только паролем, который не является частью ключ.

В то время как при замене запросов первый запрос не выполняется, его соединение закрывается и не попадает в пул. Второй запрос должен начинаться с нового соединения, будет использовать его пароль и завершится неудачей.


Чтобы изолировать запросы, вы можете:

  • используйте уникальный FtpWebRequest.ConnectionGroupName для разных запросов, чтобы заставить их использовать разные пулы соединений.
  • или отключить FtpWebRequest.KeepAlive для полного отключения пула соединений.