C # Доступ к локальным сетевым ресурсам из функций Azure с использованием учетных данных - PullRequest
0 голосов
/ 26 октября 2018

Некоторые предыстории: В настоящее время мы получаем файлы от нескольких поставщиков данных на FTP-сервер, размещенный нашим партнером по хостингу.В рамках нового проекта мы настраиваем функцию Azure.Эта функция выполняется в группе ресурсов, которую наш партнер по хостингу настроил для доступа к VPN / частной сети.Эта функция является первым шагом в процессе замены нескольких устаревших программ в Excel / VBA функциями Azure.

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

Теперь я часами гуглял в поисках решения и считаю, что нашел его, используя https://stackoverflow.com/a/295703/998791 и https://stackoverflow.com/a/1197430/998791

public sealed class NetworkConnection : IDisposable
{
    private string _uncShare;

    public NetworkConnection(string uncShare, NetworkCredential credentials)
    {
        var nr = new Native.NETRESOURCE
        {
            dwType = Native.RESOURCETYPE_DISK,
            lpRemoteName = uncShare
        };

        var userName = string.IsNullOrEmpty(credentials.Domain) ? credentials.UserName : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName);

        int result = Native.WNetUseConnection(IntPtr.Zero, nr, credentials.Password, userName, 0, null, null, null);
        if (result != Native.NO_ERROR)
        {
            throw new Win32Exception(result);
        }
        _uncShare = uncShare;
    }

    public void Dispose()
    {
        if (!string.IsNullOrEmpty(_uncShare))
        {
            Native.WNetCancelConnection2(_uncShare, Native.CONNECT_UPDATE_PROFILE, false);
            _uncShare = null;
        }
    }

    private class Native
    {
        public const int RESOURCETYPE_DISK = 0x00000001;
        public const int CONNECT_UPDATE_PROFILE = 0x00000001;
        public const int NO_ERROR = 0;

        [DllImport("mpr.dll")]
        public static extern int WNetUseConnection(IntPtr hwndOwner, NETRESOURCE lpNetResource, string lpPassword, string lpUserID,
            int dwFlags, string lpAccessName, string lpBufferSize, string lpResult);

        [DllImport("mpr.dll")]
        public static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce);

        [StructLayout(LayoutKind.Sequential)]
        public class NETRESOURCE
        {
            public int dwScope = 0;
            public int dwType = 0;
            public int dwDisplayType = 0;
            public int dwUsage = 0;
            public string lpLocalName = "";
            public string lpRemoteName = "";
            public string lpComment = "";
            public string lpProvider = "";
        }
    }
}

Использование:

using (new NetworkConnection(ftpServerSettings.UNCPath, new NetworkCredential(ftpServerSettings.UserName, ftpServerSettings.Password, ftpServerSettings.Domain)))
            {
                using (new NetworkConnection(fileServerSettings.UNCPath, new NetworkCredential(fileServerSettings.UserName, fileServerSettings.Password, fileServerSettings.Domain)))
                {
                    handler.HandleFolders(bankDataRepository.GetFolderSettings());
                }
            }

При локальном запуске это работает нормально, но при запуске из Azure я получаю исключение System.ComponentModel.Win32Exception с сообщением «Доступ запрещен».

Я не уверен, разрешен ли DllImport в функциях Azure, если мне нужен FullTrust (я что-то видел об этом где-то) или проблема связана с разрешениями на сервере.

Можеткто-нибудь, пожалуйста, просветите меня?

1 Ответ

0 голосов
/ 29 октября 2018

В результате большого количества поисков я обнаружил следующее: Доступ к хранилищу файлов Azure из функции Azure ссылка на https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#restricted-outgoing-ports

В нем говорится:

Ограниченные исходящие порты. Независимо от адреса, приложения не могут подключаться ни к чему, используя порты 445, 137, 138 и 139. Другими словами, даже при подключении к не частному IP-адресу или адресу виртуальной сети, подключения к портам 445, 137, 138 и 139. не разрешены.

Итак, то, что мы пытаемся сделать, невозможно, и не имеет ничего общего с DllImport и т. Д., Что, я думаю, прекрасно работает, если не пытаетсяиспользовать SMB.

...