我有一个ASP.NET MVC应用程序,我将上传的内容文件存储在虚拟目录中。这个虚拟目录直接位于IIS中我的MVC网站下面。
我的问题是虚拟目录允许匿名访问。任何登录或未登录的人都可以输入我的虚拟目录的公共URL并读取其中的文件。是否可以在允许访问之前强制对此虚拟目录的任何请求运行身份验证/授权例程的方式配置IIS(或其他)?
这是我可以在我的网站的web.config中配置的,还是在这种情况下请求从未命中任何服务器端代码?如果它从未到达服务器端代码(并将请求直接提供给IIS),我如何更改我的实现以要求我的站点进行身份验证/授权,然后提供我的文件。
感谢您的帮助!
答案 0 :(得分:4)
我不知道这可能与您的要求完全相同。但是,我确实知道一种方法可以使用不同的方法。也许它会对你有用。
我们的想法是将安全文件存储在Web不可用的文件夹中(而不是虚拟目录)。然后,在像Controllers/DownloadController.cs
这样的控制器上有一个处理用户身份验证和文件服务的方法。这是一个可以从c:\myfiles
中检索文件的示例方法:
Controllers / DownloadController.cs(仅限操作方法):
[Authorize]
public FileResult Download(string filename)
{
//get content type from file extension
var contentType = getContentTypeFromExtension(filename);
//return file with filename as third argument to
// trigger browser's download bahavior
return File(Path.Combine(fileFolder, filename), contentType, filename);
}
[Authorize]
public FileResult Open(string filename)
{
//get content type from file extension
var contentType = getContentTypeFromExtension(filename);
//return file without download filename so that
// the file is opened in browser (if possible)
return File(Path.Combine(fileFolder, filename), contentType);
}
//method to get content type of file from registry using file extension
static string getContentTypeFromExtension (string fileName)
{
string contentType = "application/unknown";
string ext = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
contentType = regKey.GetValue("Content Type").ToString();
return contentType;
}
fileFolder
变量应该在类级别定义。我把它拿出来是因为它弄乱了代码格式。 :)
答案 1 :(得分:0)
如果您使用集成身份验证运行IIS 7或更高版本,则上载的内容将通过ASP.NET运行时运行,因此所有正常的身份验证技巧都可以正常运行 - 只需将web.config添加到该文件夹即可执行某些操作安全
IIS 6或更早版本提出了不同的挑战。一个更好的想法是使用HTTP处理程序“前置”文件,该处理程序将它们从文件夹中抓取,以便您的文件受运行时保护。