C# 3.5 ASP.net 文件 IO 问题,UnauthorizedAccessException 到网络共享文件

Posted

技术标签:

【中文标题】C# 3.5 ASP.net 文件 IO 问题,UnauthorizedAccessException 到网络共享文件【英文标题】:C# 3.5 ASP.net File IO issue, UnauthorizedAccessException to file on network share 【发布时间】:2009-05-05 16:20:18 【问题描述】:

每次我尝试访问(只是读取)网络共享上的文件时都会收到 UnauthorizedAccessException"\\server\folder1\folder2\file.pdf."

我正在模拟对上述文件夹具有读写权限的域\aspnet 用户。该文件不是只读的。

我尝试通过 System.Security.Permissions.FileIOPermission 查找权限。它只是说禁止访问所有文件。

我不确定我还能做什么。

我在 Framework 3.5、WinXP、IIS 5.1 上使用 Visual Studio 2008、ASP.net 2.0。

【问题讨论】:

您确定您模拟的是域级别帐户而不是计算机帐户吗?您需要一个域级帐户才能访问共享。 @NYSystemsAnalyst,我很肯定。 【参考方案1】:

ASP.NET 用户无法使用网络路径。所以你需要有一个windows帐户 将拥有所有权利,然后您需要在 web.config 中强加一些东西,如下所示。

<identity impersonate="true" userName="domainname\windowuseraccount" password="password"/>

【讨论】:

【参考方案2】:

我假设您已正确设置了模拟。您已关闭匿名访问,将身份验证模式设置为 Windows 并将模拟设置为 true 等。

即使所有这些都正确完成并且冒充了正确的帐户,您仍然无法访问该文件。被模拟的帐户正在使用所谓的网络凭据。这些仅在进行模拟的机器上有效。当您尝试访问计算机本身上的文件时,访问是使用用户的凭据执行的,但对于共享上的文件,访问是作为未经身份验证的用户完成的,因此不允许访问。

为了允许您使用用户的凭据进行远程工作,即访问共享、远程数据库的集成安全性等,您需要使用委托而不是模拟。这是一个有点复杂的主题,涉及您的 Active Directory 设置和 IIS 配置。看看this article,它应该会给你一个很好的起点。

【讨论】:

【参考方案3】:

确保域用户具有安全权限共享权限。即在共享文件夹中,在属性的“共享”选项卡下以及“安全”选项卡下添加域用户。

【讨论】:

【参考方案4】:

您使用的是哪个 IIS 版本?如果是版本 6,您可以将 Web 应用程序放在它自己的应用程序池中,然后将该应用程序池的标识设置为域用户帐户。然后,授予该域用户帐户访问网络共享的权限。

【讨论】:

这个还是可以的,但是需要设置整个网站的标识,因为5.1不支持应用池。【参考方案5】:

仅供参考,您可以将以下内容放在一个 aspx 文件中,以验证您的页面运行的标识:

<%@ Page Language="C#" %>
<% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); %>

要访问网络共享,上述用户需要是网络管理员设置的域帐户。

【讨论】:

以上是关于C# 3.5 ASP.net 文件 IO 问题,UnauthorizedAccessException 到网络共享文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 在 ASP.NET 3.5 中动态设置“application/ld+json”Schema.org 元数据

如何使用 C# asp.net 在 GridView 中添加文件上传日期和/或时间?

如何在 VS2010 中使用 asp.net 重新配置和编译网站到 Framework 3.5?

C#写ASP.NET,怎么导出一个DataTable到Excel

ASP.NET 3.5 - 在 pdf 查看器中直接从流中打开 PDF

上周热点回顾(3.5-3.11)