【问题标题】:Impersonation on IIS 7.5 - fileaccess on network drive - System.UnauthorizedAccessExceptionIIS 7.5 上的模拟 - 网络驱动器上的文件访问 - System.UnauthorizedAccessException
【发布时间】:2018-11-16 11:00:13
【问题描述】:

环境:IIS 7.5、Windows 7 Pro、Visual Studio 2012、Webapp 使用 Framework 4.0

我尝试通过网络服务 (asmx) 使用 \\server\share\directory 等路径从文件服务器获取目录列表。

我在 web.config 中使用如下配置:

<identity impersonate="true" />
<authentication mode="Windows" />

我检查 User.Identity.Name 和 Threading.Thread.CurrentPrincipal.Identity.Name 并获取用于登录的域\用户名。如果我尝试获取“\\server\share\directory”的目录列表,则会引发“System.UnauthorizedAccessException”。

我尝试了很多方法,甚至使用本地系统、本地服务或域管理员作为应用程序池的身份。

当我将配置 system.webServer/serverRuntime authenticatedUserOverride 从 UseAuthenticatedUser 更改为 UseWorkerProcessUser 时,我可以访问网络共享,但以应用程序池用户的身份而不是使用 Web 服务的用户身份。在此配置中,我无法获取有关已使用登录名的信息,而是始终以应用程序池的用户身份获取。

是否可以在不模拟的情况下获得 windows-login-user ? 或者必须做什么才能成功访问网络文件系统?

我认为我的机器上的 UAC 已禁用。

【问题讨论】:

  • \server\share\directory 是您的问题中的拼写错误,还是您在代码的开头使用了单个反斜杠?需要两个反斜杠 \\server\share\directory。您确定您同时拥有目录本身和共享安全的访问权限吗?检查 CurrentPrincipal 应确保您的模拟按预期工作。
  • 对不起!双反斜杠显示为单反斜杠。我编辑帖子。
  • 网络共享通常作为网络驱动器(例如 K:\, I:) 映射到“模拟”用户,当他登录到他的工作站时。所以我认为访问权限应该没问题。
  • 查看System.Security.Principal.WindowsIdentity.GetCurrent.Name的值,这是我之前使用的方法。 ApplicationPool 设置可能有问题。尝试使用 AdvancedSettings/ProcessModel/Identity 和 LoadUserProfile 字段。

标签: vb.net exception iis windows-7 impersonation


【解决方案1】:

在尝试了很多事情之后,我发现了这个解决方案(不完美,但对我有用):

ADS/域控制器:

  • 将新用户“IIS-User”添加到活动目录
  • 将组域管理员添加到“IIS 用户”
  • 将域管理员设置为主组
  • 通过属性编辑器编辑/添加属性 servicePrincipalName:http/[iis 的计算机名]
  • 在 ADS-Server-Manager 中保存并关闭 usereditor
  • 打开 usereditor -> 新选项卡“委托” -> 允许用户“IIS-User”委托服务

带有 IIS 的 PC/服务器:

  • 打开 IIS 管理器
  • 编辑应用程序池:将身份设置为应用程序池的新用户,用于 webservice/asp-app
  • 使用 IIS-manger 的配置编辑器编辑配置:
  • system.web/authentication mode=Windows
  • system.web/identity impersonate=True
  • system.webServer/security/authentication/windowsAuthentication enabled=True,useAppPoolCredebtials=True
  • system.webServer/serverRuntime authenticatedUserOverride=UseAuthenticatedUser
  • system.webServer/validation validateIntegratedModeConfiguration=false

现在 web 服务可以使用新用户(“IIS-User”)的权限访问网络共享,但属性 User.Identity.Name 返回登录用户的名称。但现在我可以检查,登录用户是否有权访问文件/目录并仅显示用户可访问的文件/目录。

也许有一些不必要的配置设置,但在搜索了几个小时的解决方案后,我很高兴找到了一个可行的解决方案。

   Private Shared Function getSecId4User(user As IPrincipal) As SecurityIdentifier
    Return getSecId4Username(user.Identity.Name)
End Function

Private Shared Function getSecId4Username(username As String) As SecurityIdentifier
    Dim account As New NTAccount(username)
    Return account.Translate(GetType(SecurityIdentifier))
End Function

Private Shared Function isVisible4User(di As DirectoryInfo, secId As SecurityIdentifier) As Boolean
    Dim dirSec As DirectorySecurity = di.GetAccessControl
    Dim authRules As AuthorizationRuleCollection = dirSec.GetAccessRules(True, True, GetType(SecurityIdentifier))
    For Each ar As FileSystemAccessRule In authRules
        If secId.Equals(CType(ar.IdentityReference, SecurityIdentifier)) Then
            Dim fileSystemRights As FileSystemRights = ar.FileSystemRights
            Select Case fileSystemRights
                Case System.Security.AccessControl.FileSystemRights.FullControl
                    Return True
                Case System.Security.AccessControl.FileSystemRights.AppendData
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ChangePermissions
                    Return True
                Case System.Security.AccessControl.FileSystemRights.CreateDirectories
                    Return True
                Case System.Security.AccessControl.FileSystemRights.CreateFiles
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Delete
                    Return True
                Case System.Security.AccessControl.FileSystemRights.DeleteSubdirectoriesAndFiles
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ExecuteFile
                    Return True
                Case System.Security.AccessControl.FileSystemRights.FullControl
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ListDirectory
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Modify
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Read
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadAndExecute
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadAttributes
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadData
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadExtendedAttributes
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadPermissions
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Synchronize
                    Return True
                Case System.Security.AccessControl.FileSystemRights.TakeOwnership
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Traverse
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Write
                    Return True
                Case System.Security.AccessControl.FileSystemRights.WriteAttributes
                    Return True
                Case System.Security.AccessControl.FileSystemRights.WriteData
                    Return True
                Case System.Security.AccessControl.FileSystemRights.WriteExtendedAttributes
                    Return True

                Case Else

            End Select
        End If
    Next
    Return False
End Function

Private Shared Function isVisible4User(fi As FileInfo, secId As SecurityIdentifier) As Boolean
    Dim filesec As FileSecurity = fi.GetAccessControl
    Dim authRules As AuthorizationRuleCollection = filesec.GetAccessRules(True, True, GetType(SecurityIdentifier))
    For Each ar As FileSystemAccessRule In authRules
        If secId.CompareTo(CType(ar.IdentityReference, SecurityIdentifier)) = 0 Then
            Dim fileSystemRights As FileSystemRights = ar.FileSystemRights
            Select Case fileSystemRights
                Case System.Security.AccessControl.FileSystemRights.FullControl
                    Return True
                Case System.Security.AccessControl.FileSystemRights.AppendData
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ChangePermissions
                    Return True
                Case System.Security.AccessControl.FileSystemRights.CreateDirectories
                    Return True
                Case System.Security.AccessControl.FileSystemRights.CreateFiles
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Delete
                    Return True
                Case System.Security.AccessControl.FileSystemRights.DeleteSubdirectoriesAndFiles
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ExecuteFile
                    Return True
                Case System.Security.AccessControl.FileSystemRights.FullControl
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ListDirectory
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Modify
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Read
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadAndExecute
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadAttributes
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadData
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadExtendedAttributes
                    Return True
                Case System.Security.AccessControl.FileSystemRights.ReadPermissions
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Synchronize
                    Return True
                Case System.Security.AccessControl.FileSystemRights.TakeOwnership
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Traverse
                    Return True
                Case System.Security.AccessControl.FileSystemRights.Write
                    Return True
                Case System.Security.AccessControl.FileSystemRights.WriteAttributes
                    Return True
                Case System.Security.AccessControl.FileSystemRights.WriteData
                    Return True
                Case System.Security.AccessControl.FileSystemRights.WriteExtendedAttributes
                    Return True

                Case Else

            End Select
        End If
    Next
    Return False
End Function

Checking of accessibility

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多