c# - Necesidad de suplantar al usuario para acceder al recurso de red, cuenta Asp.Net
impersonation delegation (5)
Necesito acceder a un recurso de red en el que solo una cuenta de dominio determinada tiene acceso. Estoy utilizando la llamada LogonUser, pero obtengo una excepción "El usuario no tiene privilegios necesarios", ya que la aplicación web se ejecuta con la cuenta asp.net y no tiene los permisos adecuados para realizar esta llamada.
¿Hay alguna forma de evitarlo? Cambiar la identidad o los permisos de la cuenta ASP.Net no es una opción ya que esta es una máquina de producción con muchos proyectos en ejecución. ¿Hay una mejor manera de lograr esto?
Usando Asp.Net 2.0, Autenticación de formularios.
Saludos cordiales.
¿Puedes cambiar la ACL que protege el recurso de red? Un truco que he usado en el pasado es crear un grupo de Active Directory y luego colocar el objeto de computadora en ese grupo. Luego uso ese grupo en la Lista de control de acceso del objeto (archivo, recurso compartido, etc.) al que necesito acceder.
Esto me permitió ejecutar Servicios de Windows como Sistema Local y obtener acceso a los recursos de red protegidos. Y este truco también parece funcionar para el proceso ASP.NET que se ejecuta como Servicio de red.
Puedes agregar un
<identity impersonate="true" userName=""/>
etiquetar en su web.config, pero puede que no sea lo ideal ya que probablemente no quiera ejecutar todo el sitio como ese usuario ...
¿Puede asignar el recurso compartido de red como un disco local con DomainName & Password ... y luego extraer archivos al sitio web a través del disco mapeado?
NET USE Z: //SERVER/Share password /USER:DOMAIN/Username /PERSISTENT:YES
Simplemente llamar a LogonUser no es suficiente. Debes hacerte pasar por ese usuario. Puede suplantar solo por el acceso al recurso de red.
El código de ejemplo se puede encontrar en MSDN .
Solo he tenido una experiencia íntima con esto en 1.1, así que las cosas pueden haber cambiado en los 2.0 días pero ... Tenemos una aplicación que se implementa en escenarios de intranet, y tenemos el mismo objetivo. Funcionamos con suplantación de identidad activada, autenticación en modo formularios, acceso anónimo desactivado. La manera más fácil de controlar esto (que he encontrado) es poner las credenciales del usuario que tiene acceso en el web.config. Van al nodo donde conviertes identidad personificada. ¡Si es información súper brillante, no lo haría de esta manera! Solo accedimos a gráficos compartidos en un entorno de impresión, por lo que la mayoría de los sitios se conforman con configurar una cuenta limitada para que podamos ponerla en el sitio web. LogonUser realmente necesita privilegios elevados. Msdn tiene algunos buenos artículos sobre cómo hacerse pasar por un usuario específico en el código. Me gustaría pescar algunos enlaces, pero este teléfono no funciona copiar y pegar.
- Con este WebPart y me conecto a un recurso de red con acceso restringido, puse un archivo yy cierro la conexión con el recurso (como usuario con acceso otorgado), no necesita hacer una nueva conexión compartida, esa fue la única restricción, que mi Los sistemas me hacen un departamento. Puede ser, hay muchas importaciones que son necesarias, pero hago muchas pruebas y no tengo tiempo para limpiar el código. Espero que te ayude (disculpa mi pobre ingles).
Importaciones del sistema de importaciones System.ComponentModel Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.IO Imports System.IO.File Imports System.Diagnostics Imports System.Xml.Serialization Imports Microsoft.SharePoint Imports Microsoft.SharePoint.Utilities Importaciones Microsoft.SharePoint.WebPartPages Importaciones Microsoft.SharePoint.WebControls Importaciones Microsoft.SharePoint.Administration Imports System.Security.Principal Imports System.Security.Permissions Imports System.Runtime.InteropServices Importaciones System.Environment Imports System.Net.Sockets Imports System.Web .UI.HtmlControls
Public Class Impersonalizacion Private Const LOGON32_PROVIDER_DEFAULT Como Integer = 0 Private Const 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
Descripción de la clase final para WebPart1. "), XmlRoot (Namespace: =" SPSCopiarFichero ")> _ Public Class WebPart1 Hereda 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
Clase final