【问题标题】:Denied acces to a file拒绝访问文件
【发布时间】:2013-11-29 14:39:56
【问题描述】:

我有一个类似的代码:

string file;

using (StreamReader r = new StreamReader("xml.xml"))
{
    file = r.ReadToEnd();
}

XElement xml = XElement.Parse(file);

using (XmlWriter w = XmlWriter.Create("xml.xml")) //The point of problem!
{
    w.WriteStartDocument();
    ...;
    w.WriteEndDocument();
}

当我尝试像控制台应用程序一样运行它时,一切正常。但是当我想在 ASP.NET 应用程序中使用它时,问题就开始了。在 using 行,它抛出 UnauthorizedAccessException 异常,描述为“访问路径被拒绝”。为什么?

【问题讨论】:

  • 有多少请求同时尝试访问xml.xml? ASP.NET 是高度并发的......
  • 检查是否有权限写入 IIS 文件夹
  • 附带说明:在应用程序内编辑文件不是一个好主意 - 它可能导致应用程序域回收
  • 运行 Web 应用程序的帐户是否有权访问“xml.xml”?除非您使用模拟,否则 asp.net 在 AppPool 身份下运行,默认情况下是 ASPNET 用户。
  • 第一行很容易写string file = File.ReadAllText("xml.xml");

标签: c# asp.net


【解决方案1】:

您需要检查您的应用程序池使用哪个帐户来访问您的服务器文件/文件夹,例如,编写一个代码将一个文件复制到应用程序文件夹,检查所有安全信息,复制并粘贴到这个问题文件夹上,通常使用此帐户“IIS_IURRS”完全控制测试...

【讨论】:

  • 实际上是它的网络服务,有时,你所指的,可以是 ASPNET 或 IIS_USERS。仅取决于操作系统,但如今,它可以是 IIS_USERS 也可以是网络服务。还取决于正在使用的应用程序池和运行它的用户帐户
【解决方案2】:

如果 IIS/Web 服务器配置正确,则使用权限集非常有限的帐户。由于您的路径指向应用程序目录,因此很可能不允许应用程序池帐户写入此位置。
如果您在控制台应用程序中运行代码,则会应用您的用户权限,并且您很可能被允许写入项目的输出文件夹,因为 Visual Studio 在您的帐户下写入生成输出。
我不建议更改应用程序池帐户或文件系统中应用程序文件夹的权限 - 这是一个非常明智的限制,可以限制攻击者可能造成的麻烦。
因此,我建议将文件移动到帐户可以在不更改权限的情况下写入的文件夹,或者在帐户被授予权限的应用程序文件夹层次结构之外定义一个特殊的文件夹。
另请记住,多个用户可能同时访问该文件,因此数据库可能是存储数据的更好选择。

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2013-08-08
    • 2012-11-19
    • 2011-05-11
    相关资源
    最近更新 更多