我有一个可执行文件,我想限制谁可以下载。我有UI修剪,因此当用户无权下载可执行文件时,链接不存在。我在web.config中加入了一条规则来保护资源免受未经授权的下载,但它似乎没有用。
<location path="Utilities/SomeTool.exe">
<system.web>
<authorization>
<allow roles="SomeRole" />
<deny users="*"/>
</authorization>
</system.web>
</location>
当我尝试下载资源时,我看到的是登录页面,如果用户不属于应该能够下载资源的角色,则会出现这种情况。
我可以更改web.config中的规则,以便它允许特定用户,并且我能够访问该特定用户的可执行文件,但这不起作用,因为我需要修改访问规则对于添加到角色的每个用户。
<location path="Utilities/SomeTool.exe">
<system.web>
<authorization>
<allow users="MyUserName"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
我已经设置了web.config以利用IIS7中的集成管道,方法是按照this page的指示删除并重新添加模块列表。这应该设置我的网站将所有资源视为ASP.NET资源。
是否有人知道我在IIS7的配置中可能缺少什么来保护可执行文件?
我已经想到了我可以实现的其他解决方案,以保护可执行文件免受未经授权的下载,例如创建链接将调用并返回资源的Web服务。然后在Web服务中,我可以在返回可执行文件之前执行用户角色的验证。但这似乎比我应该经历的工作更多。
这是我web.config的system.web部分:
<system.web>
<compilation debug="false" targetFramework="4.0" />
<httpRuntime enableVersionHeader="false" requestValidationMode="2.0" />
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="~/MyErrorPage.aspx" />
</customErrors>
<authentication mode="Forms">
<forms timeout="60" ticketCompatibilityMode="Framework40" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
<sessionState timeout="60" />
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear />
<add name="MyMembershipProvider" type="MyMembershipProvider" applicationName="MyApp" />
</providers>
</membership>
<roleManager defaultProvider="MyRoleProvider" enabled="true" cacheRolesInCookie="true" cookieTimeout="60">
<providers>
<clear />
<add name="MyRoleProvider" type="MyRoleProvider" applicationName="MyApp" />
</providers>
</roleManager>
</system.web>
作为旁注,web.config在我的网站在Visual Studio 2010中托管时可以使用,但在IIS7中运行时会失败。
更新:我试图保护基于角色的* .html和* .aspx页面的不同资源,我看到同样的问题,即使用户确实属于相应的角色,也会被重定向到登录页面。 / p>
提前致谢。
答案 0 :(得分:0)
您已经提到过IIS7集成模式,试图为所有文件类型调用ASP.net处理程序...
您可以在此处详细了解: URL-authorization and non-Asp.Net related file types 和这里: Does web.config authorization work on files other than aspx?
在我的脑海中,我至少会尝试将所有私有文件放在子目录中,并将位置安全性应用于目录,而不是实际文件本身。这可能会解决您的问题。
就个人而言,我会保护一个目录路径,而不是一个文件,因为它将来证明文件名的变化。