1

编辑 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 路径上的文件或目录列表(这些的组合和单独打开)

  1. 给予“每个人”对该文件夹的完全访问权限(不仅仅是读取)
  2. 给定 ASP.NET 帐户“作为操作系统的一部分”
  3. 给定 IIS_WPG 组“作为操作系统的一部分”
  4. 用过的<authentication mode="Windows" />
  5. 用过的<identity impersonate="true"/>

如果我使用与登录站点相同的帐户远程连接(使用 RDP)到服务器,则可以正常访问文件。它只是不能通过代码工作。

编辑2:
我尝试过的是:

  1. 打开 Windows 身份验证:文件只能在同一台机器上访问(不是 UNC 共享),无法连接到数据库
  2. 打开表单验证,可以连接到数据库但不能访问文件(由于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 本地帐户。

4

2 回答 2

1

正如 RichardOD 所说,您将无法在 IIS 和 WebDev 上运行代码。

您最好的选择是 Project>Properties>Web>Use local IIS web server。

否则需要修改访问控制策略。

编辑以回应评论:我似乎 OP 需要做一些铁杆模仿:

我过去曾使用代码从代码隐藏中以另一个用户身份连接到 UNC。还有一个看起来不错的最新版本,但我没有使用它,所以不能保证。

这可能有帮助,也可能没有。值得一试。

于 2010-02-23T15:21:34.890 回答
0

您的意思是使用内置 Web 服务器 (Cassini) 吗?模拟与在 IIS 中的工作方式不同(请参阅Cassini 认为有害)。您可以将 IIS 用作 Visual Studio 中的 Web 服务器。我通常这样做,因为它可以防止像这样奇怪的部署时间问题。

于 2010-02-23T15:24:01.947 回答