Müssen Sie Benutzer forAccessing Netzwerkressource, Asp.Net Konto Impersonate
-
04-07-2019 - |
Frage
Ich brauche eine Netzwerk-Ressource zuzugreifen, auf das nur ein bestimmtes Domain-Konto Zugriff hat. Ich bin der Logonuser-Call, sondern erhalten eine „User hat priviliege nicht erforderlich“ Ausnahme, da die Web-Anwendung mit dem asp.net-Konto ausgeführt wird und es verfügt nicht über ausreichende Berechtigungen, um diesen Anruf zu machen.
Gibt es eine Möglichkeit, dies zu umgehen? die Identität oder Berechtigungen des ASP.Net Kontos zu ändern, ist keine Option, da dies eine Produktionsmaschine mit vielen Projekten laufen. Gibt es einen besseren Weg, dies zu erreichen?
Mit Asp.Net 2.0, Formularauthentifizierung.
Mit freundlichen Grüßen.
Lösung
Just Aufruf Logonuser ist nicht genug. Sie müssen diese Benutzer verkörpern. Sie können nur den Zugriff auf die Netzwerk-Ressource ausgeben.
Beispielcode kann auf MSDN .
Andere Tipps
Sie können ein
hinzufügen<identity impersonate="true" userName=""/>
Tag zu Ihrem web.config aber das ist vielleicht nicht ideal sein, wie Sie wahrscheinlich nicht wollen, um die gesamte Website als dieser Benutzer laufen ...
Können Sie die Netzwerkfreigabe als lokales Laufwerk mit dem Domainnamen & Passwort Karte ... und dann Dateien über das zugeordnete Laufwerk auf die Website ziehen?
NET USE Z: \\SERVER\Share password /USER:DOMAIN\Username /PERSISTENT:YES
Ich habe nur intime Erfahrung mit diesem unter 1.1, so Dinge könnten in den 2,0 Tage geändert hav aber ... Wir haben eine App bekommen, die in Intranetszenarien eingesetzt werden, und wir schlagen die gleiche Sache. Wir betreiben mit identity impersonate eingeschaltet, Formularmodus Authentifizierung, den anonymen Zugriff aktiviert. Der einfachste Weg, dies zu kontrollieren (die ich gefunden habe) ist es, die Anmeldeinformationen des Benutzers zu setzen, die den Zugang in der web.config hat. Sie gehen auf den Knoten, auf dem Sie Identität drehen Identitätswechsel auf. Wenn es super scret info ist würde ich es nicht auf diese Weise tun aber! Wir sind nur gemeinsam genutzte Grafiken in einer Druckumgebung zugreifen, so dass die meisten Websites ein eingeschränktes Konto einrichten glücklich sind für uns in der web.confit zu setzen. Logonuser in der Tat erhöht privelidges brauchen. Msdn hat einige gute Artikel auf, wie man einen bestimmten Benutzer in Code zu imitieren. Ich würde ein paar Links herauszuzufischen, aber das Telefon nicht kopieren und einfügen tun.
Können Sie die ACL ändern, um die Netzwerk-Ressource zu schützen? Ein Trick, den ich in der Vergangenheit verwendet habe, ist eine Active Directory-Gruppe zu erstellen und dann den Computer ein Objekt in dieser Gruppe setzen. Ich benutze dann diese Gruppe in der Zugriffssteuerungsliste des Objekts (Datei, zu teilen usw.), die ich zugreifen müssen.
Das hat mir erlaubt, Windows Services als lokales System ausgeführt und Zugriff auf die geschützten Netzwerkressourcen zu erhalten. Und dieser Trick scheint auch für den ASP.NET-Prozess zu arbeiten, die als Netzwerkdienst ausgeführt wird.
- Mit diesem WebPart y mit eingeschränktem Zugang zu einer Netto-Ressource verbinden habe ich eine Datei und y die Verbindung mit der Ressource (als Benutzer mit Zugriff gewährt) schließen, müssen Sie nicht eine neue Freigabe-Verbindung vornehmen müssen, war, dass de nur restricction , dass mein sistems departament für mich. sein kann, gibt es viele Importe, die necesary, aber ich habe zu viele Tests und ich havent Zeit bekam den Code zu reinigen. Ich hoffe, dass die Hilfe für Sie. (Sorry für mein schlechtes Englisch).
Import System Imports System.ComponentModel Importe System.Web.UI Importe System.Web.UI.WebControls Imports System.IO Importe System.IO.File Imports System.Diagnostics Importe System.Xml.Serialization Importe Microsoft.SharePoint Importe Microsoft.SharePoint.Utilities Importe Microsoft.SharePoint.WebPartPages Importe Microsoft.SharePoint.WebControls Importe Microsoft.SharePoint.Administration Importe System.Security.Principal Importe System.Security.Permissions Imports System.Runtime.InteropServices Importe System.Environment Importe System.Net.Sockets Importe System.Web.UI.HtmlControls
Public Class Impersonalizacion Private Const 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 ‚Beschreibung für WebPart1. "), XmlRoot (Namespace: =" SPSCopiarFichero ")> _ Public Class WebPart1 Erbe 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