2

我想从网络上存在的文件夹中读取文件。

当我尝试手动访问此文件夹时(通过运行命令提供类似\\ABCServer\Documents的路径),它会要求我提供凭据(用户名和密码)。提供正确的凭据后,我可以访问/读取文件。

当我尝试从 ASP.NET 中的 C# 代码中读取相同的文件时,它给了我一个错误:

登录失败:用户名未知或密码错误

在读取文件期间如何通过 C# 代码传递凭据?

以下是我正在使用的部分代码:

Stream s = File.OpenRead(filePath);
byte[] buffer = new byte[s.Length];            
try
{
    s.Read(buffer, 0, (Int32)s.Length);
}            
finally 
{ 
    s.Close();
}     

笔记:

  • 代码工作正常
  • 我正在使用带有 C# 的 ASP.NET 4.0
  • IIS 版本为 7.5
4

2 回答 2

4

这是来自http://support.microsoft.com/kb/306158

public const int LOGON32_LOGON_INTERACTIVE=2;
public const int LOGON32_PROVIDER_DEFAULT=0;

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);

private 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_INTERACTIVE,
      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;
}

private void undoImpersonation() {
  impersonationContext.Undo();
}
于 2012-12-17T20:05:56.583 回答
1

您可以使用模拟来执行此操作。是如何完成的问题和答案。

于 2012-12-17T18:50:17.923 回答