【问题标题】:Need to Impersonate user forAccessing Network resource, Asp.Net Account需要模拟用户访问网络资源,Asp.Net 帐户
【发布时间】:2010-09-19 00:13:27
【问题描述】:

我需要访问只有给定域帐户才能访问的网络资源。 我正在使用 LogonUser 调用,但出现“用户没有所需的权限”异常,因为 Web 应用程序使用 asp.net 帐户运行,并且它没有足够的权限来进行此调用。

有没有办法绕过它? 更改 ASP.Net 帐户的身份或权限不是一种选择,因为这是一台运行着许多项目的生产机器。 有没有更好的方法来实现这一点?

使用 Asp.Net 2.0,表单身份验证。

亲切的问候。

【问题讨论】:

    标签: c# .net asp.net impersonation delegation


    【解决方案1】:

    你可以添加一个

    <identity impersonate="true" userName=""/>
    

    标记到您的 web.config,但这可能并不理想,因为您可能不想以该用户身份运行整个网站...

    您能否使用域名和密码将网络共享映射为本地驱动器...然后通过映射的驱动器将文件拉取到网站?

    NET USE Z: \\SERVER\Share password /USER:DOMAIN\Username /PERSISTENT:YES
    

    【讨论】:

      【解决方案2】:

      我只在 1.1 下有过这方面的亲密体验,所以在 2.0 的日子里情况可能会发生变化,但是...... 我们有一个部署在 Intranet 场景中的应用程序,我们也遇到了同样的事情。我们在打开身份模拟、表单模式身份验证、关闭匿名访问的情况下运行。控制这个(我发现)的最简单方法是将有权访问的用户的凭据放在 web.config 中。他们继续在您打开身份模拟的节点上。如果它是超级秘密信息,我不会这样做!我们只在打印环境中访问共享图形,因此大多数网站都乐于为我们设置一个受限帐户以放入 web.confit。 LogonUser 确实需要提升的特权。 Msdn 有一些关于如何在代码中模拟特定用户的好文章。我会找出一些链接,但这款手机不会复制粘贴。

      【讨论】:

        【解决方案3】:

        仅调用 LogonUser 是不够的。您需要模拟该用户。您可以冒充访问网络资源。

        可以在MSDN找到示例代码。

        【讨论】:

          【解决方案4】:

          能否更改保护网络资源的 ACL?我过去使用的一个技巧是创建一个 Active Directory 组,然后将计算机对象放入该组。然后,我在需要访问的对象(文件、共享等)的访问控制列表中使用该组。

          这使我可以将 Windows 服务作为本地系统运行并访问受保护的网络资源。而且这个技巧似乎也适用于作为网络服务运行的 ASP.NET 进程。

          【讨论】:

            【解决方案5】:
            • 通过此 WebPart y 连接到具有受限访问权限的网络资源,我放置了一个文件并 y 关闭与资源的连接(作为具有授予访问权限的用户),您不需要建立新的共享连接,这是唯一的限制,我的系统部门给我做的。可能是,有很多必要的导入,但我做了很多测试,我没有时间清理代码。我希望对你有所帮助。 (对不起我糟糕的英语)。

            进口系统 导入 System.ComponentModel 导入 System.Web.UI 导入 System.Web.UI.WebControls 导入系统.IO 导入 System.IO.File 导入 System.Diagnostics 导入 System.Xml.Serialization 导入 Microsoft.SharePoint 导入 Microsoft.SharePoint.Utilities 导入 Microsoft.SharePoint.WebPartPages 导入 Microsoft.SharePoint.WebControls 导入 Microsoft.SharePoint.Administration 导入 System.Security.Principal 导入 System.Security.Permissions 导入 System.Runtime.InteropServices 导入系统.环境 导入 System.Net.Sockets 导入 System.Web.UI.HtmlControls

            公共类非人格化 Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0 私有常量 LOGON32_LOGON_INTERACTIVE As Integer = 2

            <DllImport("advapi32.dll", SetLastError:=True)> _
            Public Shared Function LogonUser(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 Boolean
            End Function
            
            <DllImport("advapi32.dll", EntryPoint:="DuplicateToken", ExactSpelling:=False, CharSet:=CharSet.Auto, SetLastError:=True)> _
            Public Shared Function DuplicateToken(ByVal ExistingTokenHandle As IntPtr, ByVal ImpersonationLevel As Integer, ByRef DuplicateTokenHandle As IntPtr) As Integer
            End Function
            
            Public Shared Function WinLogOn(ByVal strUsuario As String, ByVal strClave As String, ByVal strDominio As String) As WindowsImpersonationContext
                Dim tokenDuplicate As New IntPtr(0)
                Dim tokenHandle As New IntPtr(0)
                If LogonUser(strUsuario, strDominio, strClave, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle) Then
                    If DuplicateToken(tokenHandle, 2, tokenDuplicate) <> 0 Then
                        Return (New WindowsIdentity(tokenDuplicate)).Impersonate()
                    End If
                End If
                Return Nothing
            End Function
            

            结束类 'WebPart1 的描述。 "), XmlRoot(命名空间:="SPSCopiarFichero")> _ 公共类 WebPart1 继承 Microsoft.SharePoint.WebPartPages.WebPart

            Protected WithEvents File1 As HtmlInputFile
            
            Dim vdestino As String = "\\centappd20nd01\uploads_avisos"
            Dim vtemporal As String = "c:\pdf"
            
            Protected WithEvents boton1 As Button
            Protected WithEvents usuario As TextBox
            Protected WithEvents contra As TextBox
            Protected WithEvents dominio As TextBox
            Protected WithEvents destino As TextBox
            Protected WithEvents origen As TextBox
            Protected WithEvents temporal As TextBox
            Protected WithEvents log As TextBox
            'Render this Web Part to the output parameter specified.
            Protected Overrides Sub RenderWebPart(ByVal output As System.Web.UI.HtmlTextWriter)
                log.RenderControl(output)
                output.Write("<br><font>Ruta Origen</font><br>")
                File1.RenderControl(output)
                output.Write("<br><font>Ruta Temporal </font><br>")
                temporal.RenderControl(output)
                output.Write("<br><font>Ruta Destino </font><br>")
                destino.RenderControl(output)
                output.Write("<br><font>Usuario </font><br>")
                usuario.RenderControl(output)
                output.Write("<br><font>Contraseña </font><br>")
                contra.RenderControl(output)
                output.Write("<br><font>Dominio </font><br>")
                dominio.RenderControl(output)
                output.Write("<br><br><center>")
                boton1.RenderControl(output)
                output.Write("</center>")
            End Sub
            Protected Overrides Sub CreateChildControls()
            
                dominio = New TextBox
                With dominio
                    .Text = "admon-cfnavarra"
                    .Width = Unit.Pixel("255")
                End With
                Controls.Add(dominio)
            
                boton1 = New Button
                With boton1
                    .Text = "Copiar Fichero"
                End With
                Controls.Add(boton1)
            
                File1 = New HtmlInputFile
                With File1
            
                End With
                Controls.Add(File1)
            
                usuario = New TextBox
                With usuario
                    .Text = "SVCWSINCPre_SNS"
                    .Width = Unit.Pixel("255")
                End With
                Controls.Add(usuario)
            
                contra = New TextBox
                With contra
                    .Text = "SVCWSINCPre_SNS"
                    .Width = Unit.Pixel("255")
                End With
                Controls.Add(contra)
            
                destino = New TextBox
                With destino
                    .Text = vdestino
                    .Width = Unit.Pixel("255")
                End With
                Controls.Add(destino)
            
                log = New TextBox
                With log
                    .Width = Unit.Percentage(100)
                    .BackColor = System.Drawing.Color.Black
                    .ForeColor = System.Drawing.Color.White
                End With
                Controls.Add(log)
            
                temporal = New TextBox
                With temporal
                    .Text = vtemporal
                    .Width = Unit.Pixel("255")
                End With
                Controls.Add(temporal)
            End Sub
            Private Sub boton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles boton1.Click
                If File1.PostedFile.FileName <> "" Then
                    Dim _objContext As WindowsImpersonationContext = Nothing
                    log.Text = QuienSoy()
                    CopyFile(File1.PostedFile.FileName, temporal.Text)
                    _objContext = Impersonalizacion.WinLogOn(usuario.Text, contra.Text, dominio.Text)
                    CopyFile(temporal.Text & "\" & System.IO.Path.GetFileName(File1.PostedFile.FileName), destino.Text)
                    _objContext.Undo()
                Else
                    log.Text = "Se debe introducir un fichero"
                End If
            End Sub
            Friend Shared Function QuienSoy() As String
                Return WindowsIdentity.GetCurrent().Name
            End Function
            Public Function CopyFile(ByVal StartPath As String, ByVal EndPath As String)
                Try
                    Dim fn As String = System.IO.Path.GetFileName(StartPath)
                    System.IO.File.Copy(StartPath, EndPath & "\" & fn, False)
                    log.Text = "Fichero Copiado Correctamente"
                Catch ex As Exception
                    log.Text = ex.Message
                End Try
            End Function
            

            结束类

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-05-22
              • 2012-01-09
              • 1970-01-01
              • 2011-02-08
              • 2011-10-11
              • 2017-12-12
              • 1970-01-01
              相关资源
              最近更新 更多