#asp.net
#asp.net
Вопрос:
Я использую ASP.NET Платформа 4.0.У меня есть каталог, который содержит 10 файлов PDF, т. е. pdf1, pdf2 ….pdf10. При нажатии кнопки я использую ответ.Перенаправление и передача пути к файлу Pdf, чтобы открыть его в браузере. но это позволяет пользователю просматривать путь (URL) к папке PDF, используя этот URL, он может напрямую открывать любой другой PDF. Как я могу запретить ему доступ к PDF напрямую с URL
Комментарии:
1. Я думаю, это будет сложно, если вы не создадите какой-либо механизм аутентификации.
Ответ №1:
Используйте Request.ServerVariables["HTTP_REFERER"]
это сообщит вам, откуда поступил запрос. Если его нет на вашем сайте, примите соответствующие меры.
например
if(Request.ServerVariables["HTTP_REFERER"].ToLower().IndexOf("mysite.com") == -1){
// Not from my site
Response.Redirect("NotAllowed.aspx");
}
Комментарии:
1. Не могли бы вы, пожалуйста, добавить подробности, что вы хотите сказать.
2. Это не сработает, если перенаправленный URL-адрес переходит непосредственно в pdf, поскольку этот код негде запустить. Что нужно сделать, так это перенаправить на httphandler, чтобы затем можно было выполнить проверку перед потоковой передачей PDF.
Ответ №2:
Эта ссылка может помочь вам запретить ему доступ к PDF напрямую с URL-адреса.
Комментарии:
1. Использование httphandler является правильным вариантом, если вы хотите выполнить какую-либо проверку на стороне сервера перед потоковой передачей PDF.
Ответ №3:
Используйте этот код в Global.asax.cs и вызывайте [NoDirectAccess] для всех контроллеров
//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDirectAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.UrlReferrer == null ||
filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Home", action = "Login", area = "" }));
}
}
}
Ответ №4:
Вам нужно будет добавить безопасный уровень. Если вы используете MVC, это, вероятно, будет проще реализовать, поскольку вы будете выполнять авторизацию в действии контроллера. Однако для классического ASP вам, вероятно, потребуется реализовать пользовательский обработчик.
Ответ №5:
Простого решения для этого нет. Вы могли бы разработать какой-то скользящий код на основе даты / времени сервера, который должен быть частью строки запроса, и проверять правильность этого при загрузке страницы, если вы сделаете это достаточно сложным / длинным, тогда люди не смогут вводить это вручную.