2

我有一个ASP.NET MVC应用程序,我将上传的内容文件存储在虚拟目录中。这个虚拟目录就在我的MVC网站的正下方。ASP.NET MVC网站下的虚拟目录中的IIS内容验证

我的问题是,虚拟目录允许匿名访问。任何人,无论登录或不登录,都可以在我的虚拟目录中输入一个公共URL并读取其中的文件。是否可以配置IIS(或其他),以强制任何请求到这个虚拟目录在允许访问之前运行认证/授权例程?

这是不是我可以在我的网站的web.config配置,或不要求从不打任何服务器端代码,在这种情况下?如果它从不碰到服务器端代码(并将请求直接提供给IIS),我如何更改我的实现以要求我的站点进行身份验证/授权,然后提供我的文件。

感谢您的帮助!

回答

3

我不知道这是可能的,你究竟是如何要求它。但是,我知道你可以用不同的方法做到这一点。也许它会为你工作。

的想法是受保护的文件存储,是不是可以从网络(而不是虚拟目录)的文件夹。然后,在处理用户身份验证和文件服务的控制器(如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变量应在类级别来定义。我把它拿出来,因为它搞乱了代码格式。 :)

+0

有趣。我想避免使用处理程序,但这可能是我唯一的选择。有一个问题,当返回的“文件”是图像时,它是否会在浏览器中打开,就好像用户点击了图像,或者是否开始下载图像作为下载内容一样。我希望前者。谢谢。 – kmehta 2010-07-27 20:31:33

+0

如果您希望它像下载一样行事,只需将第三个参数添加到返回文件(...)行。我会更新代码来举例。 – 2010-07-27 20:36:54

+0

谢谢!我会给这个镜头。 – kmehta 2010-07-27 20:42:35

0

如果您正在运行IIS 7或更高版本,具有集成的身份验证,那么上传的内容将通过ASP.NET运行时中运行,因此所有正常的认证工作技巧 - 只需添加一个web.config文件夹执行一些安全性。

IIS 6或更早的版本提出了不同的挑战。一个更好的想法是用一个HTTP处理程序“前置”文件,将它们从一个文件夹中抓取出来,以便您的文件受到运行时的保护。

+0

谢谢。我运行IIS 7和我加入此部分: <授权> < “?” 拒绝用户= /> <允许用户= “*”/> 的结果是,在认证之前,我在登录页面上丢失了CSS(这是一个好兆头),但是我仍然能够访问VD中与web.config相同的根目录下的内容文件。有任何想法吗? – kmehta 2010-07-27 20:30:01

+0

VD是一个单独的应用程序,所以它需要自己的web.config。还没有尝试过这种情况,所以我不确定它是否会拿起您的身份验证。 – 2010-07-27 20:59:05