2008-10-24 16 views
3

J'ai besoin d'accéder à une ressource réseau sur lequel seul un compte de domaine donné a accès. J'utilise l'appel LogonUser, mais je reçois une exception «L'utilisateur n'a pas de privilège requis», car l'application Web est en cours d'exécution avec le compte asp.net et ne dispose pas des autorisations adéquates pour effectuer cet appel.Besoin de Impersonate utilisateur forAccessing ressources réseau, Asp.Net Compte

est-il un moyen de contourner le problème? 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. Existe-t-il un meilleur moyen d'y parvenir?

En utilisant Asp.Net 2.0, l'authentification par formulaire.

Cordialement.

Répondre

7

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

Exemple de code se trouve sur MSDN.

1

Vous pouvez ajouter un

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

à votre web.config mais peut-être pas idéal que vous ne voulez probablement pas d'exécuter l'ensemble du site tant que l'utilisateur ...

Can vous mappez le partage réseau en tant que lecteur local avec le nom de domaine & Mot de passe ... et puis tirez des fichiers sur le site Web via le lecteur mappé?

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

Je n'ai eu une expérience intime avec ce sous 1.1, les choses pourraient hav changé dans les 2.0 jours, mais ... Nous avons une application qui obtient déployée dans les scénarios intranet, et nous frappons la même chose. Nous courons avec l'identité d'identité activée, l'authentification en mode formulaire, l'accès anonyme désactivé. Le moyen le plus simple de contrôler cela (que j'ai trouvé) est de mettre les informations d'identification de l'utilisateur qui a accès à web.config. Ils vont sur le noeud où vous activez l'identité d'identité. Si c'est de l'information de super-mêlée, je ne ferais pas ça comme ça! Nous n'accédons qu'aux graphismes partagés dans un environnement d'impression, de sorte que la plupart des sites sont heureux de mettre en place un compte limité pour nous de mettre dans le web.confit. LogonUser a en effet besoin de ponts privés élevés. Msdn a de bons articles sur la façon d'usurper l'identité d'un utilisateur spécifique dans le code. Je pêcherais quelques liens mais ce téléphone ne fait pas de copier coller.

0

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) que j'ai besoin d'accéder.

Cela m'a permis d'exécuter Windows Services en tant que système local et obtenir l'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.

0
  • Avec ce composant WebPart y connecter à une ressource réseau avec accès restreint, je mis un fichier et y fermer la connexion avec la ressource (en tant qu'utilisateur avec accès autorisé), vous ne avez pas besoin de faire une nouvelle connexion part, qui était de seulement restricction, que mon département sistems me fait. Peut-être, il ya beaucoup d'importations nécessaires, mais je fais de nombreux tests et je n'ai pas le temps de nettoyer le code. J'espère que cela vous aidera. (Désolé pour mon mauvais anglais).

système Importations Importations System.ComponentModel Importations System.Web.UI Importations System.Web.UI.WebControls Imports System.IO Importations System.IO.File Importations System.Diagnostics Imports System. Xml.Serialization importations Microsoft.SharePoint importations Microsoft.SharePoint.Utilities importations Microsoft.SharePoint.WebPartPages importations Microsoft.SharePoint.WebControls importations Microsoft.SharePoint.Administration importations Syste m.Security.Principal Importations System.Security.Permissions Importations System.Runtime.InteropServices Importations System.Environment Importations System.Net.Sockets Importations System.Web.UI.HtmlControls

Classe publique Impersonalizacion Const privé LOGON32_PROVIDER_DEFAULT As 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 

End Class « description pour WebPart1. "), XmlRoot (namespace: =" SPSCopiarFichero ")> _ Classe publique WebPart1 Hérite 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 

End Class