2015-06-29 5 views
0

У меня возникают проблемы с попыткой прочитать файл, который хранится на сетевом диске при размещении моего сайта/запроса на лазурном веб-сайте.Доступ к стороннему сетевому диску при использовании веб-сайтов 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(); 
     } 
    } 

Если это не разрешено на лазури, кто-нибудь знает о мы можем обойти это без необходимости создания полной виртуальной машины? Я хотел бы сохранить идеальный лазурный веб-сайт/webapp.

ответ

0

Это роль в Интернете, роль рабочего или веб-приложение? Я знаю, что в случае роли удаленный хост в вашем сценарии должен находиться в той же частной сети, что и ваша роль (это может быть справедливо и для веб-приложения). Кроме того, у нас был аналогичный сценарий, в котором мы решили использовать Azure Files, который позволяет устанавливать доли в роли, которую вы можете попробовать. http://blogs.msdn.com/b/windowsazurestorage/archive/2014/05/12/introducing-microsoft-azure-file-service.aspx

Смежные вопросы