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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top