我的安全性似乎有一个奇怪的问题:
我的网站包含以下文件夹:
IIS APPPOOL \ Classic用户可以完全访问此“readyfordownload”文件夹。
现在我有一个控制台APP,它在readyfordownload文件夹中创建一个zipfile。这是从c#classlib完成的。奇怪的是,IIS APPOOL无法访问此文件,即使它完全控制该文件夹。此外,classlib首先创建一个xlsx文件,稍后将其添加到zip中。 APPPOOL用户可以访问xlsx文件。
如果我从网站后面的代码在C#classlib中运行相同的函数,则会创建相同的zip文件,并且IIS APPPOOL用户可以访问该文件....
有什么想法吗?
像这样创建zip(不是实际代码,但它是相同的) http://dotnetzip.codeplex.com/
using (ZipFile zip = new ZipFile())
{
// add this map file into the "images" directory in the zip archive
zip.AddFile("test.xlsx");
zip.Save("MyZipFile.zip");
}
操作系统是Windows 2008 R2 Web服务器 ZIP库是Dotnetzip(Ionic)
更新:我最感兴趣的是为什么ZIP文件没有获得权利而xlsx文件没有....
答案 0 :(得分:5)
您是否尝试过明确设置FileAccessSecurity?也许文件没有从目录继承ACL。
答案 1 :(得分:2)
apppool用户可以访问xlsx文件,因为您的控制台直接在readyfordownload文件夹下创建它。
另一方面,zip文件首先在临时文件夹中创建,然后复制到您的文件夹中。这意味着文件上的文件权限设置错误。
确保IIS_IUSR和DefaultAppPool用户可以访问您的wwwroot。
正如scottm建议更改您的控制台代码,以便为zip文件上的IUSR和DefaultAppPool用户授予权限。您的代码应如下所示:
using (ZipFile zip = new ZipFile())
{
// add this map file into the "images" directory in the zip archive
zip.AddFile("test.xlsx");
zip.Save("MyZipFile.zip");
var accessControl = File.GetAccessControl("MyZipFile.zip");
var fileSystemAccessRule = new FileSystemAccessRule(
@"BUILTIN\IIS_IUSRS",
FileSystemRights.Read | FileSystemRights.ReadAndExecute,
AccessControlType.Allow);
var fileSystemAccessRule2 = new FileSystemAccessRule(
@"IIS AppPool\DefaultAppPool",
FileSystemRights.Read | FileSystemRights.ReadAndExecute,
AccessControlType.Allow);
accessControl.AddAccessRule(fileSystemAccessRule);
accessControl.AddAccessRule(fileSystemAccessRule2);
File.SetAccessControl(path, accessControl);
}
答案 2 :(得分:0)
检查Windows EventLog是否存在相关错误。有关详细信息,请使用ProcessMonitor,以便查看权限是否存在问题。
答案 3 :(得分:0)
使用“高级设置属性页”配置文件夹的安全性。 (选择属性 - &gt;安全性)。另请注意,应用程序池可以模拟用户,以便应用程序可能无法使用应用程序池的标识提供请求。默认情况下,模拟可能无效。您必须在Web配置中明确设置它。例如。 <identity impersonate="true" />
或<identity impersonate="true" userName="domain\user" password="password" />
Sriwantha Sri Aravinda