È necessario impersonare l'utente per l'accesso alla risorsa di rete, account Asp.Net
-
04-07-2019 - |
Domanda
Devo accedere a una risorsa di rete a cui ha accesso solo un determinato account di dominio. Sto usando la chiamata LogonUser, ma ottengo un " Utente non ha richiesto il privilegio " eccezione, poiché l'applicazione Web è in esecuzione con l'account asp.net e non dispone di autorizzazioni adeguate per effettuare questa chiamata.
C'è un modo per aggirarlo? La modifica dell'identità o delle autorizzazioni dell'account ASP.Net non è un'opzione in quanto si tratta di una macchina di produzione con molti progetti in esecuzione. C'è un modo migliore per raggiungere questo obiettivo?
Utilizzando Asp.Net 2.0, Autenticazione moduli.
Cordiali saluti.
Soluzione
Basta chiamare LogonUser non è abbastanza. Devi impersonare quell'utente. Puoi impersonare solo l'accesso alla risorsa di rete.
Il codice di esempio è disponibile in MSDN .
Altri suggerimenti
Puoi aggiungere un
<identity impersonate="true" userName=""/>
tag al tuo web.config ma potrebbe non essere l'ideale in quanto probabilmente non vuoi eseguire l'intero sito come quell'utente ...
Puoi mappare la condivisione di rete come unità locale con DomainName & amp; Password ... e quindi estrarre i file sul sito Web tramite l'unità mappata?
NET USE Z: \\SERVER\Share password /USER:DOMAIN\Username /PERSISTENT:YES
Ho avuto un'esperienza intima con questo sotto 1.1, quindi le cose potrebbero essere cambiate nei 2.0 giorni ma ... Abbiamo un'app che viene distribuita in scenari Intranet e colpiamo la stessa cosa. Corriamo con la rappresentazione dell'identità attivata, l'autenticazione in modalità moduli, l'accesso anonimo disattivato. Il modo più semplice per controllare questo (che ho trovato) è inserire le credenziali dell'utente che ha accesso a web.config. Vanno sul nodo in cui si impersonano le identità. Se si tratta di informazioni super scret, non lo farei in questo modo! Stiamo solo accedendo alla grafica condivisa in un ambiente di stampa, quindi la maggior parte dei siti è felice di impostare un account limitato per noi da inserire nel web.confit. LogonUser ha davvero bisogno di privilegi elevati. Msdn ha alcuni buoni articoli su come impersonare un utente specifico nel codice. Vorrei pescare alcuni collegamenti ma questo telefono non esegue il copia e incolla.
È possibile modificare l'ACL proteggendo la risorsa di rete? Un trucco che ho usato in passato è quello di creare un gruppo di Active Directory e quindi inserire l'oggetto computer in quel gruppo. Quindi uso quel gruppo nell'elenco Controllo accessi dell'oggetto (file, condivisione, ecc.) A cui devo accedere.
Questo mi ha permesso di eseguire i servizi di Windows come sistema locale e ottenere l'accesso alle risorse di rete protette. E questo trucco sembra funzionare anche per il processo ASP.NET che funziona come servizio di rete.
- Con questa WebPart y connettersi a una risorsa di rete con accesso limitato Metto un file e chiudo la connessione con la risorsa (come utente con accesso concesso), non è necessario effettuare una nuova connessione di condivisione, che era de solo restrizione , che il mio dipartimento di sistema mi fa. Può essere, ci sono molte importazioni che sono necessarie, ma faccio molti test e non ho tempo di pulire il codice. Spero che ti aiuti. (scusate il mio povero inglese).
Sistema di importazione Importa System.ComponentModel Importa System.Web.UI Importa System.Web.UI.WebControls Importa System.IO Importa System.IO.File Import System.Diagnostics Importa System.Xml.Serialization Importa Microsoft.SharePoint Importa Microsoft.SharePoint.Utilities Importa Microsoft.SharePoint.WebPartPages Importa Microsoft.SharePoint.WebControls Importa Microsoft.SharePoint.Administration Importa System.Security.Principal Importazioni System.Security.Permissions Importa System.Runtime.InteropServices Importa System.Environment Importa System.Net.Sockets Importa System.Web.UI.HtmlControls
Impersonalizacion di classe pubblica Cost privato LOGON32_PROVIDER_DEFAULT come intero = 0 Cost privato LOGON32_LOGON_INTERACTIVE Come intero = 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
Fine classe 'Descrizione per WebPart1. "), XmlRoot (spazio dei nomi: = " SPSCopiarFichero ") > _ Classe pubblica WebPart1 Eredita 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
Fine classe