ASP.NET MVC网站下的虚拟目录中的IIS内容验证
我有一个ASP.NET MVC应用程序,我将上传的内容文件存储在虚拟目录中。这个虚拟目录就在我的MVC网站的正下方。ASP.NET MVC网站下的虚拟目录中的IIS内容验证
我的问题是,虚拟目录允许匿名访问。任何人,无论登录或不登录,都可以在我的虚拟目录中输入一个公共URL并读取其中的文件。是否可以配置IIS(或其他),以强制任何请求到这个虚拟目录在允许访问之前运行认证/授权例程?
这是不是我可以在我的网站的web.config配置,或不要求从不打任何服务器端代码,在这种情况下?如果它从不碰到服务器端代码(并将请求直接提供给IIS),我如何更改我的实现以要求我的站点进行身份验证/授权,然后提供我的文件。
感谢您的帮助!
我不知道这是可能的,你究竟是如何要求它。但是,我知道你可以用不同的方法做到这一点。也许它会为你工作。
的想法是受保护的文件存储,是不是可以从网络(而不是虚拟目录)的文件夹。然后,在处理用户身份验证和文件服务的控制器(如Controllers/DownloadController.cs
)上有一个方法。下面是可以从c:\myfiles
检索文件的样品的方法:
控制器/ 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
变量应在类级别来定义。我把它拿出来,因为它搞乱了代码格式。 :)
如果您正在运行IIS 7或更高版本,具有集成的身份验证,那么上传的内容将通过ASP.NET运行时中运行,因此所有正常的认证工作技巧 - 只需添加一个web.config文件夹执行一些安全性。
IIS 6或更早的版本提出了不同的挑战。一个更好的想法是用一个HTTP处理程序“前置”文件,将它们从一个文件夹中抓取出来,以便您的文件受到运行时的保护。
谢谢。我运行IIS 7和我加入此部分
VD是一个单独的应用程序,所以它需要自己的web.config。还没有尝试过这种情况,所以我不确定它是否会拿起您的身份验证。 – 2010-07-27 20:59:05
有趣。我想避免使用处理程序,但这可能是我唯一的选择。有一个问题,当返回的“文件”是图像时,它是否会在浏览器中打开,就好像用户点击了图像,或者是否开始下载图像作为下载内容一样。我希望前者。谢谢。 – kmehta 2010-07-27 20:31:33
如果您希望它像下载一样行事,只需将第三个参数添加到返回文件(...)行。我会更新代码来举例。 – 2010-07-27 20:36:54
谢谢!我会给这个镜头。 – kmehta 2010-07-27 20:42:35