如何使用c#传递凭据在服务器上创建文件夹

时间:2012-07-03 07:43:36

标签: c# asp.net impersonation

我正在使用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#代码呢?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

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

确保始终Undo WindowsImpersonationContext

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