2

我正在使用 C# 开发一个 ASP.NET 应用程序,该应用程序试图通过登录从网站读取一些文件,然后将文件写入本地驱动器。

我已经通过使用 - 读取默认凭据来传递网络凭据以登录网站

request.Proxy.Credentials = CredentialCache.DefaultCredentials;

现在我想将文件存储在需要一些凭据才能访问该位置的服务器目录中。

登录网站的代码 -

                string webUrl = "https://web.site.com/";

            string formParams = string.Format("user={0}&password={1}", username, password);

            WebRequest req = WebRequest.Create(webUrl);
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            req.Proxy.Credentials = CredentialCache.DefaultCredentials;
            byte[] bytes = Encoding.ASCII.GetBytes(formParams);
            req.ContentLength = bytes.Length;
            using (Stream os = req.GetRequestStream())
            {
                os.Write(bytes, 0, bytes.Length);
            }
            WebResponse resp = req.GetResponse();

            cookieHeader = resp.Headers["Set-cookie"];

而且位置是\\11.11.11.11\Folder\

如何传递访问该位置的凭据?到目前为止,我已经了解impersonation但没有得到任何帮助。我有可以访问该位置的凭据。但是我怎样才能通过使用 C# 代码来做到这一点呢?

提前致谢 :)

4

1 回答 1

1

您可以LogonUser为此使用 API。您使用该LogonUser函数创建一个表示WindowsIdentity您要模拟的令牌。WindowsIdentity然后,您使用令牌创建一个并调用Impersonate身份。随后的所有代码都在模拟身份下运行。

确保您始终UndoWindowsImpersonationContext.

[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, 
                                    string lpszPassword, int dwLogonType, 
                                    int dwLogonProvider, out IntPtr phToken);

[DllImport("advapi32.dll", SetLastError=true)]
public extern static bool DuplicateToken(
    IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL,
    out IntPtr DuplicateTokenHandle);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool CloseHandle(IntPtr hHandle);

const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_PROVIDER_DEFAULT = 0;
IntPtr hToken;
IntPtr hTokenDuplicate;

if (LogonUser(username, domain, password,
              LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out hToken))
{
    if (DuplicateToken(hToken, 2, out hTokenDuplicate))
    {
        WindowsIdentity windowsIdentity = new WindowsIdentity(hTokenDuplicate);
        WindowsImpersonationContext impersonationContext =
            windowsIdentity.Impersonate();
        try
        {
            // Access files ...
            // ...
        }
        finally
        {
            impersonationContext.Undo();   
            if (hToken != IntPtr.Zero) CloseHandle(hToken);
            if (hTokenDuplicate != IntPtr.Zero) CloseHandle(hTokenDuplicate);
        }
    }
}
于 2012-07-03T07:59:13.903 回答