我需要访问只有给定域帐户才有权访问的网络资源。 我正在使用LogonUser调用,但获得“用户没有必要的特权”异常,因为Web应用程序使用asp.net帐户运行,并且它没有足够的权限来进行此调用。
有没有办法绕过它? 更改ASP.Net帐户的身份或权限不是一个选项,因为这是一个运行许多项目的生产机器。 有没有更好的方法来实现这一目标?
使用Asp.Net 2.0,表单身份验证。
亲切的问候。
答案 0 :(得分:7)
仅仅调用LogonUser是不够的。您需要冒充该用户。您可以模拟仅访问网络资源。
示例代码可在MSDN上找到。
答案 1 :(得分:1)
您可以添加
<identity impersonate="true" userName=""/>
标记到您的web.config,但这可能不太理想,因为您可能不希望以该用户身份运行整个网站...
您是否可以使用DomainName&amp ;;将网络共享映射为本地驱动器密码...然后通过映射的驱动器将文件拉到网站?
NET USE Z: \\SERVER\Share password /USER:DOMAIN\Username /PERSISTENT:YES
答案 2 :(得分:0)
我只有1.1的亲密经历,所以在2.0天内情况可能会有所改变但...... 我们有一个应用程序可以部署在Intranet方案中,我们也会做同样的事情。我们运行身份模拟打开,表单模式身份验证,匿名访问关闭。控制它的最简单方法(我发现)是将有权访问的用户的凭据放在web.config中。它们会转到您进行身份模拟的节点上。如果这是超级scret信息,我不会这样做!我们只在打印环境中访问共享图形,因此大多数网站都很乐意为我们设置一个有限的帐户来放入web.confit。 LogonUser确实需要升高的privelidges。 Msdn有一些关于如何在代码中模拟特定用户的好文章。我会删除一些链接,但这款手机不会复制粘贴。
答案 3 :(得分:0)
您可以更改保护网络资源的ACL吗?我过去使用的一个技巧是创建一个Active Directory组,然后将计算机对象放入该组。然后我在我需要访问的对象(文件,共享等)的访问控制列表中使用该组。
这使我可以将Windows服务作为本地系统运行,并可以访问受保护的网络资源。这个技巧似乎也适用于作为网络服务运行的ASP.NET进程。
答案 4 :(得分:0)
进口系统 导入System.ComponentModel 导入System.Web.UI 导入System.Web.UI.WebControls 进口System.IO Imports 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 Imports System.Runtime.InteropServices 进口System.Environment 导入System.Net.Sockets Imports 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(命名空间:=”SPSCopiarFichero“)&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
结束班