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

Posted

技术标签:

【中文标题】如何通过使用 c# 传递凭据在服务器上创建文件夹【英文标题】:How to create a folder on a server by passing credentials using c# 【发布时间】:2012-07-03 07:43:35 【问题描述】:

我正在使用 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# 代码来做到这一点?

提前致谢:)

【问题讨论】:

您是说 ASP.NET 应用程序在登录后正在服务器端读取文件,然后尝试将它们保存到服务器本地的文件夹中?如果是这样,问题将是运行 Web 服务器的帐户的权限。默认情况下它没有访问权限。 如果问题如@Michael 所述,您只需为运行应用程序的帐户提供正确的凭据即可。在这种情况下,我下面的答案中的解决方案太复杂了,不适用于这个问题。 不是该服务器的本地服务器,而是不同域上的不同服务器。当我尝试通过输入服务器地址来访问该位置时,它会询问用户名和密码。我需要一种方法,以便我可以从我的应用程序登录到该服务器 查看更新后的问题 【参考方案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);
        
    

【讨论】:

您可以使用我描述的方法,也可以使用有权访问 `\\11.11.11.11\Folder` 的凭据运行应用程序。 AFAIK 没有其他方法。

以上是关于如何通过使用 c# 传递凭据在服务器上创建文件夹的主要内容,如果未能解决你的问题,请参考以下文章

来自文件的 C# Stackdriver Trace 凭据

LDAP 身份验证通过凭据

在 C# 中使用不同的凭据调用远程 powershell 脚本

WCF 服务 - ASP.net 托管 - 单点登录,如何传递凭据

如何在运行时使用 C# 创建强类型数据集?

如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?