使用Azure网站时访问第三方网络驱动器

时间:2015-06-29 09:02:39

标签: c# .net azure

在天蓝网站上托管我的网站/请求时,我在尝试阅读存储在网络驱动器上的文件时遇到问题。

代码在本地计算机上运行测试,它也适用于我们与另一个客户端有完全控制的专用服务器,但是当我们尝试读取文件时会出现以下错误。

访问路径' \ xxx.xxx.xxx.xxx \ abc \ abc.xml'被拒绝。

我想知道Azure是否被锁定以防止我不知道的这种行为。也许港口关闭了什么。

我正在使用的代码

if (impersonate.impersonateValidUser("username", "domain.com", "password"))
                    {
                        message = "impersonate ok";
                        if (!System.IO.File.Exists(file))
                        {
                            message = "no file";
                            impersonate.undoImpersonation();
                        }

                        using (StreamReader reader = File.OpenText(file))
                        {
                            message = "";
                            XmlSerializer deserializer = new XmlSerializer(typeof(TextModeSchema));
                            schema = (TextModeSchema)deserializer.Deserialize(reader);
                            reader.Close();
                        }
                    }

使用我们在很多地方使用的基本Impersonate类

public class Impersonate : IDisposable
    {
        public const int LOGON32_LOGON_INTERACTIVE = 2;
        public const int LOGON32_LOGON_NETWORK = 3;
        public const int LOGON32_LOGON_BATCH = 4;
        public const int LOGON32_LOGON_SERVICE = 5;
        public const int LOGON32_LOGON_UNLOCK = 7;
        public const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
        public const int LOGON32_LOGON_NEW_CREDENTIALS = 9;


        public const int LOGON32_PROVIDER_DEFAULT    =0;
        public const int LOGON32_PROVIDER_WINNT35    =1;
        public const int LOGON32_PROVIDER_WINNT40    =2;
        public const int LOGON32_PROVIDER_WINNT50 = 3;

       WindowsImpersonationContext impersonationContext;

        [DllImport("advapi32.dll")]
        public static extern int LogonUserA(String lpszUserName,
            String lpszDomain,
            String lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool CloseHandle(IntPtr handle);

        public bool impersonateValidUser(String userName, String domain, String password)
        {
            WindowsIdentity tempWindowsIdentity;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            if (RevertToSelf())
            {
                if (LogonUserA(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS,
                    LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                {
                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        impersonationContext = tempWindowsIdentity.Impersonate();
                        if (impersonationContext != null)
                        {
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                            return true;
                        }
                    }
                }
            }
            if (token != IntPtr.Zero)
                CloseHandle(token);
            if (tokenDuplicate != IntPtr.Zero)
                CloseHandle(tokenDuplicate);
            return false;
        }

        public void undoImpersonation()
        {
            impersonationContext.Undo();
        }


        public void Dispose()
        {
            impersonationContext.Undo();
            GC.Collect();
        }
    }

如果azure上不允许这样做,有没有人知道我们可以绕过它而无需设置完整的虚拟机?我想与理想的azure网站/ webapp保持一致。

1 个答案:

答案 0 :(得分:0)

这是Web角色,工作者角色还是Web应用程序?我知道,如果是角色,您的场景中的远程主机必须与您的角色位于同一个专用网络上(对于Web应用程序也可能如此)。此外,我们有类似的情况,我们决定使用Azure文件,允许在您可能想要尝试的角色上安装共享。 http://blogs.msdn.com/b/windowsazurestorage/archive/2014/05/12/introducing-microsoft-azure-file-service.aspx