需要模拟用户访问网络资源,Asp.Net 帐户

本文关键字:Asp Net 帐户 网络资源 访问 模拟 用户 | 更新日期: 2023-09-27 17:47:22

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

有没有办法绕过它?更改 ASP.Net 帐户的标识或权限不是一个选项,因为这是一台正在运行许多项目的生产计算机。有没有更好的方法来实现这一目标?

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

亲切问候。

需要模拟用户访问网络资源,Asp.Net 帐户

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

可以在 MSDN 上找到示例代码。

您可以添加一个

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

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

您可以将网络共享映射为具有域名和密码的本地驱动器吗?然后通过映射驱动器将文件拉到网站?

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

我只在 1.1 下对此有过亲密的经验,所以事情可能会在 2.0 天内发生变化,但是......我们有一个部署在 Intranet 方案中的应用,我们做了同样的事情。我们在启用标识模拟、关闭表单模式身份验证、关闭匿名访问的情况下运行。控制这一点的最简单方法(我发现的)是将有权访问的用户的凭据放在 web.config 中。它们位于你打开标识模拟的节点上。如果它是超级垃圾信息,我不会这样做!我们只在打印环境中访问共享图形,因此大多数网站都很乐意为我们设置一个有限的帐户,以便我们放入web.confit。登录用户确实需要提升权限。Msdn 有一些关于如何在代码中模拟特定用户的好文章。我会捞出一些链接,但这部手机不做复制粘贴。

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

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

  • 有了这个 WebPart y 连接到具有受限访问权限的网络资源,我放了一个文件并关闭了与资源的连接(作为具有授予访问权限的用户),您不需要建立新的共享连接,这只是我的系统部门对我的重新划分。可能是,有很多必要的导入,但我做了很多测试,我没有时间清理代码。我希望这对你有所帮助。(对不起,我的英语很差)。

进口系统导入系统.组件模型导入系统.Web.UI导入系统.Web.UI.WebControls进口 System.IO导入系统.IO.文件导入系统诊断导入系统.Xml.序列化导入Microsoft.SharePoint导入Microsoft.SharePoint.Utilities导入Microsoft.SharePoint.WebPartPages导入Microsoft.SharePoint.WebControls导入Microsoft.SharePoint.Administration导入系统.安全.主体导入系统.安全.权限导入系统.运行时.互操作服务进口系统.环境导入系统.Net.Sockets导入系统.Web.UI.Html控件

公共类非个性化 私有常量LOGON32_PROVIDER_DEFAULT为整数 = 0 私有常量LOGON32_LOGON_INTERACTIVE为整数 = 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(Namespace:="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

结束类