2008-10-24 5 views
3

Мне нужно получить доступ к сетевому ресурсу, к которому имеет доступ только конкретная учетная запись домена. Я использую вызов LogonUser, но получаю исключение «Пользователь не имеет необходимой привилегии», поскольку веб-приложение работает с учетной записью asp.net и у него нет достаточных прав для совершения этого вызова.Нужно олицетворять пользователя forAccessing Сетевой ресурс, учетная запись Asp.Net

Есть ли способ обойти его? Изменение идентификатора или разрешений учетной записи ASP.Net не является вариантом, так как это производственная машина со многими работающими проектами. Есть ли лучший способ достичь этого?

Использование Asp.Net 2.0, проверка подлинности форм.

С уважением.

ответ

7

Недостаточно просто вызвать LogonUser. Вы должны выдать себя за этого пользователя. Вы можете выдавать себя за доступ к сетевому ресурсу.

Пример кода можно найти на MSDN.

1

Вы можете добавить

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

тег в web.config, но это не может быть идеальным, как вы, вероятно, не хотите, чтобы запустить весь сайт, как этот пользователь ...

Может вы сопоставляете сетевой ресурс как локальный диск с DomainName & Password ... а затем вытаскиваете файлы на сайт через сопоставленный диск?

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

Я только имел интимный опыт с этим в пункте 1.1, так что вещи могут ВГ изменились в 2,0 дней, но ... У нас есть приложение, которое получает развернутую в сценариях интрасети, и мы стачка, то же самое. Мы запускаем с включенным удостоверением личности, авторизацией режима форм, отключением анонимного доступа. Самый простой способ управления этим (я нашел) - установить учетные данные пользователя, имеющего доступ в web.config. Они идут на узел, где вы включаете удостоверение личности. Если бы это была супер-информация, я бы так не сделал этого! Мы используем только совместную графику в среде печати, поэтому большинство сайтов с удовольствием настраивают ограниченную учетную запись для ввода в web.confit. LogonUser действительно нуждается в повышенных привилегиях. В Msdn есть несколько хороших статей о том, как олицетворять конкретного пользователя в коде. Я бы выломал некоторые ссылки, но этот телефон не копировал пасту.

0

Можете ли вы изменить ACL, защищающий сетевой ресурс? Трюк, который я использовал в прошлом, - создать группу Active Directory, а затем поместить объект Computer в эту группу. Затем я использую эту группу в списке контроля доступа объекта (файла, общего доступа и т. Д.), К которому я должен получить доступ.

Это позволило мне запустить службы Windows как локальную систему и получить доступ к защищенным сетевым ресурсам. И этот трюк также, похоже, работает для процесса ASP.NET, который работает как Network Service.

0
  • С этой WebPart у подключения к сети ресурсов с ограниченным доступом я положить файл и у закрыть соединение с ресурсом (как пользователь с предоставленным доступом), вам не нужно, чтобы сделать новое подключение акций, что было единственное ограничение, что мой отдел отправляет мне. Может быть, есть много импорта, что необходимо, но я делаю много тестов, и у меня нет времени на очистку кода. Надеюсь, это поможет вам. (извините за мой бедный английский).

Импорт системы Импорт System.ComponentModel Импорт System.Web.UI Импорт System.Web.UI.WebControls Импорт System.IO Импорт System.IO.File Импорт System.Diagnostics Импорт системы. Xml.Serialization Импорт Microsoft.SharePoint Импорт Microsoft.SharePoint.Utilities Импорт Microsoft.SharePoint.WebPartPages Импорт Microsoft.SharePoint.WebControls Импорт Microsoft.SharePoint.Administration Импорт Syste m.Security.Principal Импорт System.Security.Permissions Импорт System.Runtime.InteropServices Импорт System.Environment Импорт System.Net.Sockets Импорт 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 класса «Описание для WebPart1. "), XmlRoot (Пространство имен: =" SPSCopiarFichero ")> _ Public Class WebPart1 Inherits 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

Смежные вопросы