Необходимо выдать себя за пользователя для доступа к сетевому ресурсу, учетной записи Asp.Net - PullRequest
3 голосов
/ 24 октября 2008

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

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

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

С уважением.

Ответы [ 5 ]

7 голосов
/ 24 октября 2008

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

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

1 голос
/ 24 октября 2008

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

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

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

Можно ли сопоставить сетевой ресурс как локальный диск с помощью имени домена и пароля ... и затем перенаправить файлы на веб-сайт через подключенный диск?

NET USE Z: \\SERVER\Share password /USER:DOMAIN\Username /PERSISTENT:YES
0 голосов
/ 25 августа 2009
  • С помощью этой веб-части вы подключаетесь к сетевому ресурсу с ограниченным доступом. Я помещаю файл и закрываю соединение с ресурсом (как пользователь с предоставленным доступом), вам не нужно устанавливать новое подключение к общему ресурсу, это было только ограничением. , что мой системный отдел делает для меня. Может быть, есть много импортов, которые необходимы, но я делаю для многих тестов, и у меня нет времени, чтобы очистить код. Я надеюсь, что это поможет вам. (извините за мой плохой английский).

Система импорта Импортирует System.ComponentModel Импортирует System.Web.UI Импортирует System.Web.UI.WebControls Импортирует System.IO Импортирует System.IO.File Система импорта. Диагностика Импортирует System.Xml.Serialization Импортирует Microsoft.SharePoint Импортирует Microsoft.SharePoint.Utilities Импортирует Microsoft.SharePoint.WebPartPages Импортирует Microsoft.SharePoint.WebControls Импортирует Microsoft.SharePoint.Administration Импортирует System.Security.Principal Импортирует System.Security.Permissions Импортирует System.Runtime.InteropServices Система импорта. Окружающая среда Импортирует 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

Конечный класс Описание для WebPart1. "), XmlRoot (Namespace: =" SPSCopiarFichero ")> _ Открытый класс WebPart1 Унаследован от 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

Конечный класс

0 голосов
/ 24 октября 2008

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

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

0 голосов
/ 24 октября 2008

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

...