ネットワークリソース、Asp.Netアカウントにアクセスするためにユーザーを偽装する必要がある

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

質問

特定のドメインアカウントのみがアクセスできるネットワークリソースにアクセスする必要があります。 LogonUser呼び出しを使用していますが、「ユーザーには必要な特権がありません」というメッセージが表示されます。例外。Webアプリケーションはasp.netアカウントで実行されており、この呼び出しを行うための適切なアクセス許可がないためです。

それを回避する方法はありますか? ASP.NetアカウントのIDまたはアクセス許可を変更することは、多くのプロジェクトが実行されている運用マシンであるため、オプションではありません。 これを達成するためのより良い方法はありますか?

Asp.Net 2.0、フォーム認証の使用。

よろしく。

役に立ちましたか?

解決

LogonUserを呼び出すだけでは不十分です。そのユーザーになりすます必要があります。ネットワークリソースへのアクセスだけを偽装できます。

サンプルコードは MSDN にあります。

他のヒント

追加できます

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

web.configにタグ付けしますが、おそらくそのユーザーとしてサイト全体を実行したくないので、理想的ではないかもしれません...

DomainName&amp;を使用して、ネットワーク共有をローカルドライブとしてマップできますか?パスワード...そして、マップされたドライブを介してWebサイトにファイルをプルしますか?

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

これは1.1未満の経験しかありませんでしたので、2.0日で状況が変わるかもしれませんが... イントラネットシナリオで展開されるアプリがありますが、同じことをします。 ID偽装を有効にして、フォームモード認証、匿名アクセスを無効にして実行します。これを制御する最も簡単な方法(私が見つけた)は、web.configにアクセス権を持つユーザーの資格情報を入力することです。 IDの偽装を有効にするノードに移動します。それは非常に不審な情報である場合、私はしかし、このようにそれをしないだろう!印刷環境でのみ共有グラフィックスにアクセスしているため、ほとんどのサイトは、web.confitに入れるための制限付きアカウントを設定します。 LogonUserには、実際に昇格したprivelidgesが必要です。 Msdnには、特定のユーザーをコードで偽装する方法に関する優れた記事があります。私はいくつかのリンクを釣り出しますが、この携帯電話はコピーペーストを行いません。

ネットワークリソースを保護するACLを変更できますか?私が過去に使用したトリックは、Active Directoryグループを作成し、そのグループにコンピューターオブジェクトを配置することです。次に、アクセスする必要があるオブジェクト(ファイル、共有など)のアクセス制御リストでそのグループを使用します。

これにより、Windowsサービスをローカルシステムとして実行し、保護されたネットワークリソースにアクセスできるようになりました。また、このトリックは、ネットワークサービスとして実行されるASP.NETプロセスでも機能するようです。

  • このWebPartでは、アクセスが制限されたネットリソースに接続し、ファイルを配置し、リソースとの接続を(アクセスが許可されたユーザーとして)閉じます。新しい共有接続を作成する必要はありません。 、私のシステム部門が私に作ること。必要なインポートがたくさんあるかもしれませんが、私は多くのテストを行い、コードをきれいにする時間がありません。それがあなたのお役に立てば幸いです。 (私の下手な英語はごめんなさい。)

インポートシステム System.ComponentModelをインポートします System.Web.UIをインポートします System.Web.UI.WebControlsをインポートします System.IOのインポート System.IO.Fileをインポートします System.Diagnosticsのインポート 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.Environmentのインポート System.Net.Socketsをインポートします System.Web.UI.HtmlControlsをインポートします

公開クラスの非個人化     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の説明。 &quot;)、XmlRoot(Namespace:=&quot; SPSCopiarFichero&quot;)&gt; _ パブリッククラス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

終了クラス

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top