编辑 7:
我猜这毕竟不能完成,可能需要使用某种命令行应用程序来执行此操作并解析输出,尽管我预计当很多人访问时这可能会很慢文件夹和/或达到 NetBIOS 会话限制。
编辑 6:
使用 Windows 集成身份验证(使用有权访问共享和数据库的帐户),我可以获得文件/目录列表。但是,刷新页面并获得一个UnauthorizedAccessException. 可能是 NetBIOS 或 ActiveDirectory 限制。
5 个月了,除了“使用模拟”(似乎是通过 P/Invoke,因为内置的 .NET 方式似乎很不稳定)之外,仍然没有解决方案,但这也会有同样的问题。硬编码用户名/密码不是一种选择。
开发(Windows 7)框(使用 IIS 或 Visual Studio 的)内置 Web 服务器)工作正常..
编辑 5:
根据我在互联网上和这个问题中所读到的内容,唯一可行的方法是:
- 基本认证
- 冒充
- 将文件与 Web 应用程序放在同一台服务器上
这些都不是一个选项
- 用户每次都必须登录 - 缺点:额外的进入障碍,应该是无缝体验
- 用户名和密码硬编码 - 缺点:密码更改,用户编码(asp.net 帐户)将无法访问文件
- Web 服务器上要存储的文件太多,磁盘空间不足
由于必须有可以访问 UNC 共享文件的 Windows 窗体应用程序,我原以为这会起作用。那,以及当远程连接到 Web 服务器并使用 Windows 资源管理器时,我可以访问这些文件的事实。
也许 ASP.NET/IIS 安全性会阻止它在没有通过 P/Invoke 模拟的情况下工作。或者可能被防火墙阻止?
编辑 4:
确实有效的一件事是使用基本身份验证 - 集成 Windows 身份验证和摘要式身份验证没有。但是,这并不是一个真正的选择,因为密码是以明文形式发送的,并且用户在访问页面时会得到提示(这不是我想做的事情)。
编辑 3:
无论我尝试什么,我都无法获得 UNC 路径上的文件或目录列表(这些的组合和单独打开)
- 给予“每个人”对该文件夹的完全访问权限(不仅仅是读取)
- 给定 ASP.NET 帐户“作为操作系统的一部分”
- 给定 IIS_WPG 组“作为操作系统的一部分”
- 用过的
<authentication mode="Windows" /> - 用过的
<identity impersonate="true"/>
如果我使用与登录站点相同的帐户远程连接(使用 RDP)到服务器,则可以正常访问文件。它只是不能通过代码工作。
编辑2:
我尝试过的是:
- 打开 Windows 身份验证:文件只能在同一台机器上访问(不是 UNC 共享),无法连接到数据库
- 打开表单验证,可以连接到数据库但不能访问文件(由于
InvalidCastException身份现在是一个GenericIdentity)
我无法使用 Windows 身份验证,因为我无法添加角色。我不想提示输入用户名/密码,因为这是一个额外的步骤,而且它不是通过安全连接(即 SSL)。此外,我不能让 ASP.NET 帐户访问这些文件(因为我不是域管理员)。
编辑:
路径是 UNC 路径,不在本地 PC 上。
使用表单身份验证,当我尝试在 Visual Studio 中将当前用户身份转换为 aWindowsIdentity并进行调试时,我得到一个InvalidCastException. 我只是有:
WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity;
然后我得到的错误是:
Unable to cast object of type 'System.Security.Principal.GenericIdentity' to type 'System.Security.Principal.WindowsIdentity'
我正在使用模拟来获取文件列表,因为 ASP.NET 帐户无权访问这些文件。它在使用 IIS 时有效,但在 Visual Studio 中无效:
WindowsIdentity id = (WindowsIdentity)User.Identity;
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate())
{
files = Directory.GetFiles("\\server\share");
context.Undo();
}
添加<identity impersonate="true" />到web.config不会做任何事情 - 虽然我不想这样做,因为我使用 ASP.NET 帐户来查询数据库,用户没有访问权限(导致Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON')。
当我通过 web.config 打开 Windows 身份验证时,我会UnauthorizedAccessException尝试从远程共享中获取文件列表(如果我以客户端 PC 上的同一用户身份远程连接到 IIS 框,我可以访问该文件列表)。
此外,ASP.NET 帐户是在 Active Directory 中设置的帐户,而不是 IIS 本地帐户。