【问题标题】:ASP.NET Trying to access a network folder via UNCASP.NET 试图通过 UNC 访问网络文件夹
【发布时间】:2012-01-20 13:33:19
【问题描述】:

您好,我正在尝试从我的 ASP.NET Intranet Web 应用程序访问网络文件夹。这是我的代码

Dim di As DirectoryInfo = New DirectoryInfo("\\10.11.11.172\testfolder")
Dim subFiles() As FileInfo = di.GetFiles()

我明白了

Access to the path '\\10.11.11.172\testfolder\' is denied.

如何输入我的用户名和密码以使其正常工作?

【问题讨论】:

  • 我刚刚注意到我试图通过 UNC 访问的服务器不在域中。它是一个 samba 服务器 linux 机器,对我的域或用户名一无所知。当我通过 UNC 访问它是在该特定机器上创建时,Samba 会询问用户名和密码。
  • 询问 linux 管理员。也许他可以加入域。或者,也许他会根据您的需要创建一些用户名/密码。

标签: asp.net asp.net-mvc vb.net


【解决方案1】:

您的 Web 应用程序正在使用 NETWORK SERVICE 帐户运行。
您必须冒充用户才能访问网络共享。
您可以在 web.config 中设置它,查看 identity Element (ASP.NET Settings Schema)

【讨论】:

  • 但是如果我需要多个模仿者呢?
  • 因为我有不同的服务器位置和不同的用户名和密码来读取文件,有没有办法切换模仿者?
  • 我无法在 vb.net 中转换这个类的命名空间。我不明白 用户名。 这些参数是什么,我应该把它们放在我的 web.config 中吗?
  • <param> 部分是 XML cmets 的一部分。 ///<param> 之间有一个意外的换行符,需要为这些部分删除,然后代码将正常转换。
【解决方案2】:

谢谢 Be.St 我将其转换为 VB.net 以避免其他用户陷入麻烦。 这是我需要添加到我的项目中的类

Public Class UserImpersonation

    Const LOGON32_LOGON_INTERACTIVE = 2
    Const LOGON32_LOGON_NETWORK = 3
    Const LOGON32_LOGON_BATCH = 4
    Const LOGON32_LOGON_SERVICE = 5
    Const LOGON32_LOGON_UNLOCK = 7
    Const LOGON32_LOGON_NETWORK_CLEARTEXT = 8
    Const LOGON32_LOGON_NEW_CREDENTIALS = 9
    Const LOGON32_PROVIDER_DEFAULT = 0
    Const LOGON32_PROVIDER_WINNT35 = 1
    Const LOGON32_PROVIDER_WINNT40 = 2
    Const LOGON32_PROVIDER_WINNT50 = 3

    Dim impersonationContext As WindowsImpersonationContext

    Declare Function LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As String, _
                            ByVal lpszDomain As String, _
                            ByVal lpszPassword As String, _
                            ByVal dwLogonType As Integer, _
                            ByVal dwLogonProvider As Integer, _
                            ByRef phToken As IntPtr) As Integer

    Declare Auto Function DuplicateToken Lib "advapi32.dll" ( _
                            ByVal ExistingTokenHandle As IntPtr, _
                            ByVal ImpersonationLevel As Integer, _
                            ByRef DuplicateTokenHandle As IntPtr) As Integer

    Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
    Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long

    Public Function impersonateUser(ByVal userName As String, ByVal domain As String, ByVal password As String) As Boolean
        Return impersonateValidUser(userName, domain, password)
    End Function

    Public Sub undoimpersonateUser()
        undoImpersonation()
    End Sub

    Private Function impersonateValidUser(ByVal userName As String, ByVal domain As String, ByVal password As String) As Boolean

        Dim tempWindowsIdentity As WindowsIdentity
        Dim token As IntPtr = IntPtr.Zero
        Dim tokenDuplicate As IntPtr = IntPtr.Zero
        impersonateValidUser = False

        If RevertToSelf() Then
            If LogonUserA(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, token) <> 0 Then
                If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
                    tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)
                    impersonationContext = tempWindowsIdentity.Impersonate()
                    If Not impersonationContext Is Nothing Then
                        impersonateValidUser = True
                    End If
                End If
            End If
        End If
        If Not tokenDuplicate.Equals(IntPtr.Zero) Then
            CloseHandle(tokenDuplicate)
        End If
        If Not token.Equals(IntPtr.Zero) Then
            CloseHandle(token)
        End If
    End Function

    Private Sub undoImpersonation()
        impersonationContext.Undo()
    End Sub

End Class

然后在我的控制器中我使用它作为 Be.St 提到

 <Authorize()> _
        Function SearchUrlNewDir() As String


            Dim impersonateUser As New UserImpersonation
            impersonateUser.impersonateUser("username", "", "password.")

            Dim di As DirectoryInfo = New DirectoryInfo("\\10.11.11.172\remfolder")

            'Dim subFiles() As FileInfo = di.GetFiles()
            Dim subFolders() As DirectoryInfo = di.GetDirectories()

            impersonateUser.undoimpersonateUser()

            Return ""
        End Function

此类可用于通过 UNC 访问远程机器中的文件或文件夹,从 asp.net 到 samba linux 服务器,不需要模拟者与该服务器位于同一域中。

非常感谢

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2013-08-17
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多