使用用户名和密码从功能应用程序访问共享网络文件夹:访问被拒绝错误

问题描述 投票:0回答:0

我正在尝试从托管在 azure 上的函数应用程序访问远程受保护文件夹

try
{
    var impersonationContext = new WrappedImpersonationContext("domain", "username", "password");
    impersonationContext.Enter();
    FileStream networkStream = new FileStream(@"\\directory\subdirectory\myfile.pdf", FileMode.Create);
                 
    networkStream.Write(result, 0, result.Length);

    networkStream.Close();
    impersonationContext.Leave();
}
catch (Exception e)
{
    _logger.LogInformation("failed to create pdf "+e.Message);
}

问题是远程文件夹受用户名和密码保护。这是一个共享的网络目录。

要创建文件,用户需要手动打开共享目录,输入其凭据并启动文件创建应用程序。

我想要的是确保代码嵌入凭据。

这是我用来创建 ImpersonationContext 的代码

public sealed class WrappedImpersonationContext
{
    public enum LogonType : int
    {
        Interactive = 2,
        Network = 3,
        Batch = 4,
        Service = 5,
        Unlock = 7,
        NetworkClearText = 8,
        NewCredentials = 9
    }

    public enum LogonProvider : int
    {
        Default = 0,  // LOGON32_PROVIDER_DEFAULT
        WinNT35 = 1,
        WinNT40 = 2,  // Use the NTLM logon provider.
        WinNT50 = 3   // Use the negotiate logon provider.
    }

    [DllImport("advapi32.dll", EntryPoint = "LogonUserW", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain,
        String lpszPassword, LogonType dwLogonType, LogonProvider dwLogonProvider, ref IntPtr phToken);

    [DllImport("kernel32.dll")]
    public extern static bool CloseHandle(IntPtr handle);

    private string _domain, _password, _username;
    private IntPtr _token;
    private WindowsImpersonationContext _context;

    private bool IsInContext
    {
        get { return _context != null; }
    }

    public WrappedImpersonationContext(string domain, string username, string password)
    {
        _domain = String.IsNullOrEmpty(domain) ? "." : domain;
        _username = username;
        _password = password;
    }

    // Changes the Windows identity of this thread. Make sure to always call Leave() at the end.
    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public void Enter()
    {
        if (IsInContext)
            return;

        _token = IntPtr.Zero;
        bool logonSuccessfull = LogonUser(_username, _domain, _password, LogonType.NewCredentials, LogonProvider.WinNT50, ref _token);
        if (!logonSuccessfull)
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        WindowsIdentity identity = new WindowsIdentity(_token);
        _context = identity.Impersonate();
        
        Debug.WriteLine(WindowsIdentity.GetCurrent().Name);
    }

    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public void Leave()
    {
        if (!IsInContext)
            return;

        _context.Undo();

        if (_token != IntPtr.Zero)
        {
            CloseHandle(_token);
        }
        _context = null;
    }
}

System.UnauthorizedAccessException:访问路径 '\directory\subdirectory\myfile.pdf' 被拒绝。

在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath、Boolean checkHost)
在 System.IO.FileStream..ctor(字符串路径、FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize、FileOptions 选项、String msgPath、Boolean bFromProxy)
在 System.IO.FileStream..ctor(字符串路径,FileMode 模式)

有什么想法吗?
谢谢

c# azure azure-functions filestream impersonation
© www.soinside.com 2019 - 2024. All rights reserved.