Nécessité d'emprunter l'identité d'un utilisateur pour une ressource réseau en accès, compte Asp.Net

StackOverflow https://stackoverflow.com/questions/233490

Question

Je dois accéder à une ressource réseau sur laquelle seul un compte de domaine donné a accès. J'utilise l'appel LogonUser, mais j'obtiens un " utilisateur n'a pas le privilège requis " exception, car l'application Web est exécutée avec le compte asp.net et ne dispose pas des autorisations nécessaires pour passer cet appel.

Y a-t-il un moyen de le contourner? La modification de l'identité ou des autorisations du compte ASP.Net n'est pas une option, car il s'agit d'une machine de production avec de nombreux projets en cours d'exécution. Y a-t-il un meilleur moyen d'y parvenir?

Utilisation de Asp.Net 2.0, authentification par formulaires.

Cordialement.

Était-ce utile?

La solution

Il ne suffit pas d'appeler LogonUser. Vous devez emprunter l'identité de cet utilisateur. Vous pouvez emprunter l'identité uniquement pour accéder à la ressource réseau.

Vous trouverez un exemple de code sur MSDN .

Autres conseils

Vous pouvez ajouter un

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

sur votre web.config, mais cela pourrait ne pas être idéal car vous ne voulez probablement pas exécuter le site en entier en tant qu'utilisateur ...

Pouvez-vous mapper le partage réseau en tant que lecteur local avec le nom de domaine & amp; Mot de passe ... et puis extraire des fichiers sur le site Web via le lecteur mappé?

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

Je n'ai qu'une expérience intime avec cette version 1.1, donc les choses ont peut-être changé dans les 2.0 jours mais ... Nous avons une application qui est déployée dans des scénarios intranet, et nous avons la même chose. Nous exécutons avec identité avec identité activée, authentification en mode formulaire, accès anonyme désactivé. Le moyen le plus simple de contrôler cela (que j'ai trouvé) est de saisir les informations d'identification de l'utilisateur ayant accès à web.config. Ils vont sur le nœud où vous activez l'identité d'identité. Si c'est super info, je ne le ferais pas de cette façon! Nous n'accédons qu'aux graphiques partagés dans un environnement d'impression. La plupart des sites sont donc disposés à configurer un compte limité pour que nous puissions le placer dans web.confit. LogonUser a en effet besoin de ponts privés élevés. Msdn a quelques bons articles sur la façon d'emprunter l'identité d'un utilisateur spécifique dans le code. Je chercherais des liens, mais ce téléphone ne ferait pas de copier / coller.

Pouvez-vous modifier la liste de contrôle d'accès protégeant la ressource réseau? Une astuce que j'ai utilisée dans le passé consiste à créer un groupe Active Directory, puis à placer l'objet ordinateur dans ce groupe. J'utilise ensuite ce groupe dans la liste de contrôle d'accès de l'objet (fichier, partage, etc.) auquel j'ai besoin d'accéder.

Cela m’a permis d’exécuter les services Windows en tant que système local et d’avoir accès aux ressources réseau protégées. Et cette astuce semble également fonctionner pour le processus ASP.NET qui s’exécute en tant que service réseau.

  • Avec cette WebPart, connectez-vous à une ressource Internet à accès restreint. Je mets un fichier et y ferme la connexion avec la ressource (en tant qu'utilisateur disposant d'un accès autorisé), vous n'avez pas besoin de créer une nouvelle connexion de partage. , que mes départements me font. Peut-être, il y a beaucoup d'importations qui sont nécessaires, mais je fais beaucoup d'essais et je n'ai pas le temps de nettoyer le code. J'espère que cela vous aidera. (désolé pour mon anglais médiocre).

Système d'importation Imports System.ComponentModel Importations System.Web.UI Imports System.Web.UI.WebControls Importations System.IO Importations System.IO.File Système d'importation. Diagnostic Importe System.Xml.Serialization Importe Microsoft.SharePoint Importe Microsoft.SharePoint.Utilitaires Importe Microsoft.SharePoint.WebPartPages Importe Microsoft.SharePoint.WebControls Importe Microsoft.SharePoint.Administration Importations System.Security.Principal Importations System.Security.Permissions Importations System.Runtime.InteropServices Importations System.Environment Importations System.Net.Sockets Importe System.Web.UI.HtmlControls

Classe publique Impersonalizacion     Const privée Private LOGON32_PROVIDER_DEFAULT As Integer = 0     Const Privé 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

Classe finale 'Description pour WebPart1. "), XmlRoot (Namespace: = "SPSCopiarFichero") > _ Classe publique WebPart1     Hérite de 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

Classe de fin

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top