Добрый день. Подскажите, как можно решить следующую траблу: Есть сервер IIS 7.5, на нем крутится сайт c MVC3 Razor. Включена Windows аутентификация и разрешен анонимный вход. Код контроллера: Код | [Authorize] public FileDownloadResult Download(string file) {
if (User.Identity.IsAuthenticated) { try {
var fileData = GetFileData(file); return new FileDownloadResult(file, fileData); } catch (FileNotFoundException) { throw new HttpException(404, string.Format("The file {0} was not found.", file)); } } else throw new HttpException(500, string.Format("The file {0} was not found.", file)); }
[AllowCrossSiteJson] public ActionResult Check(string file) {
string filePath = Request.MapPath("~/Content/Files/" + GetTruePathFile(file)); if (System.IO.File.Exists(filePath)) {
// HttpContext.Response.Status = "200"; } else { return new HttpNotFoundResult(); } return Content("<html></html>"); }
private string GetTruePathFile(string filepath) { string file = filepath; if (file.IndexOf("$") >= 0) { file = file.Replace("$", @"/"); } if (file.IndexOf("..") >= 0) { file = file.Replace("..", ""); } return file; }
private byte[] GetFileData(string file) { file = GetTruePathFile(file); byte[] fileData = null; WindowsIdentity id = (WindowsIdentity) User.Identity; using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate()) { try { fileData = file.GetFileData(Server.MapPath("~/Content/Files/")); } catch (Exception) {
throw; } context.Undo(); } return fileData; } }
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); base.OnActionExecuting(filterContext); } }
|
Прописаны роуты: Код | routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("Download", "Files/Download/{file}", new { controller = "Files", action = "Download", file = "" } ); routes.MapRoute("Check", "Files/Check/{file}", new { controller = "Files", action = "Check", file = "" } ); routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
|
Теперь по-порядку: Действие Check - используется для анонимной проверки наличия файла. Download - используется для скачивания файла с авторизацией. Так вот, я хотел организовать проверку на доступ к определенному файлу на том же сервере с помощью возможностей NTFS. Ограничил к папке доступ всем кроме себя и файл от другого юзера все равно качается... Кусок из web.config Код | <authentication mode="Windows" /> <authorization> <allow users="*" /> </authorization> <identity impersonate="true" />
|
Как можно еще решить эту задачу?
|