تحتاج إلى انتحال شخصية مورد شبكة المستخدم ، حساب ASP.NET

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

سؤال

أحتاج إلى الوصول إلى مورد شبكة لا يمكنه سوى حساب مجال معين. أنا أستخدم مكالمة LogOnuser ، لكن الحصول على "لا يوجد لدى المستخدم استثناء من الامتياز" ، حيث يتم تشغيل تطبيق الويب مع حساب ASP.NET وليس لديه أذونات كافية لإجراء هذه المكالمة.

هل هناك طريقة للالتفاف عليها؟ إن تغيير هوية أو أذونات حساب ASP.NET ليس خيارًا لأن هذا هو آلة إنتاج مع العديد من المشاريع التي تعمل. هل هناك طريقة أفضل لتحقيق ذلك؟

باستخدام ASP.NET 2.0 ، مصادقة النماذج.

أطيب التحيات.

هل كانت مفيدة؟

المحلول

مجرد استدعاء logonuser لا يكفي. تحتاج إلى انتحال شخصية هذا المستخدم. يمكنك انتحال شخصية الوصول إلى مورد الشبكة فقط.

يمكن العثور على رمز عينة على MSDN.

نصائح أخرى

يمكنك إضافة

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

وضع علامة على الويب الخاص بك.

هل يمكنك تعيين مشاركة الشبكة كمحرك محلي مع DomainName وكلمة المرور ... ثم سحب الملفات إلى موقع الويب عبر محرك الأقراص المعين؟

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

لم يكن لدي سوى خبرة حميمة مع هذا أقل من 1.1 ، لذلك قد تغيرت الأمور في غضون 2.0 يومًا ولكن ... لدينا تطبيق يتم نشره في سيناريوهات إنترانت ، ونحن نضرب نفس الشيء. نحن نركض مع انتحال شخصية الهوية تشغيل ، ومصادقة وضع النماذج ، وإيقاف الوصول المجهول. أسهل طريقة للسيطرة على هذا (الذي وجدته) هي وضع بيانات اعتماد المستخدم التي لديها إمكانية الوصول في الويب. يذهبون في العقدة حيث تقوم بتشغيل هوية الانتحال. إذا كانت معلومات Super Scret ، فلن أفعل ذلك بهذه الطريقة! نحن نصل فقط إلى الرسومات المشتركة في بيئة طباعة ، لذلك يسعد معظم المواقع بإعداد حساب محدود لنا لوضعه على الويب. لا يحتاج LogonUser بالفعل إلى ارتفاع خصوصيات. لدى MSDN بعض المقالات الجيدة حول كيفية انتحال شخصية مستخدم معين في التعليمات البرمجية. كنت أصطاد بعض الروابط ولكن هذا الهاتف لا يقوم بنسخ معجون.

هل يمكنك تغيير ACL لحماية مورد الشبكة؟ الخدعة التي استخدمتها في الماضي هي إنشاء مجموعة Active Directory ثم وضع كائن الكمبيوتر في تلك المجموعة. ثم أستخدم هذه المجموعة في قائمة التحكم في الوصول للكائن (الملف ، المشاركة ، إلخ) التي أحتاج إلى الوصول إليها.

وقد سمح لي ذلك بتشغيل Windows Services كنظام محلي والوصول إلى موارد الشبكة المحمية. ويبدو أن هذه الخدعة تعمل أيضًا في عملية ASP.NET التي تعمل كخدمة الشبكة.

  • من خلال اتصال Webpart y بمورد صافي مع وصول مقيد ، وضعت ملفًا وأغلق الاتصال بالمورد (كمستخدم مع وصول ممنوع) ، لا تحتاج إلى إجراء اتصال جديد ، كان ذلك مجرد تقييد ، رحيل سيستمز يجعل لي. قد يكون هناك العديد من الواردات التي ضرورية ، لكنني أفعل للعديد من الاختبارات ولم أحصل على وقت لتنظيف الكود. أتمنى أن يساعدك ذلك. (عذرا لغتي الإنجليزية الفقراء).

استيراد نظام استيراد System.componentModel استيراد System.Web.ui استيراد System.Web.ui.WebControls System.io استيراد System.io.file System.Diagnostics Imports System.xml.Serialization استيراد microsoft.sharepoint استيراد microsoft.sharepoint.ublations يستورد microsoft.sharepoint.webpartpages استيراد microsoft.sharepoint.webcontrols يستورد microsoft.sharepoint.administration استيرادات system.security.principal استيراد system.security.permissions استيرادات System.Runtime.InterOpservices System.NVIRIONMENT SYSTEM.NESOKETS .ui.htmlcontrols

فئة عامة غير شخصية private const logon32_provider_default as integer = 0 const private logon32_logon_interavive 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 (مساحة الاسم: =" 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

الطبقة النهائية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top