2013-06-13 3 views
1

Я пытаюсь ограничить доступ неавторизованного пользователя к странице Utilities.aspx и перенаправить его на страницу Default.aspx.Вызов javascript перед ответом.redirect

if (authorizedUser.ToLower() != "admin") 
{ 
    if (!ClientScript.IsClientScriptBlockRegistered("UnauthorizedUserRedirect")) 
    { 
     ClientScript.RegisterStartupScript(this.GetType(), "UnauthorizedUserRedirect", "<script>alert('Unauthorized access!\n\nYou have attempted to access a page that you are not authorized to view.')</script>", true); 
     Response.Redirect("Default.aspx"); 
    } 
} 

Однако, в то время как редирект работает нормально, alert не отображается на странице. Поиск этой проблемы говорит мне, что Response.Redirect завершает свое действие до того, как код клиентской стороны вообще будет отображаться.

Как я могу показать alert перед Response.Redirect?


Я также попробовал эти два подхода в Page_Load из Default.aspx и оба не работают. Если установлен определенный сеанс, установите предупреждение.

if (Session["unauth"] != null) 
{ 
    ClientScript.RegisterStartupScript(this.GetType(), "UnauthorizedUserRedirect", "alert('Unauthorized access!\n\nYou have attempted to access a page that you are not authorized to view.');", true); 
} 


if (Session["unauth"] != null) 
{ 
    form1.Attributes.Add("OnLoad", "javascript:alert('Unauthorized access!\n\nYou have attempted to access a page that you are not authorized to view.');"); 
} 

ответ

2

Вы не можете использовать HTTP редирект + JavaScript , Если вы хотите показать предупреждение перед отправкой, вам нужно будет использовать 100% -ное решение javascript, создавая большое отверстие безопасности, которое может легко вызвать несанкционированный доступ к этой странице.

Я бы сказал, что лучшее, что вы можете сделать, это показать описательное сообщение на целевой странице. Вы можете отправить параметр querystring для этого.

+0

Или установите переменную сеанса во избежание вмешательства в запрос. Но общая идея пока лучшая среди ответов. – Renan

+0

@Renan: сеанс также можно использовать. В любом случае, примите во внимание, что я не говорю о передаче какой-либо конфиденциальной информации через querystring. –

+0

Я знаю. Просто я сделал это однажды, для сайта колледжа. В строке запроса появился текст, который будет отображаться в сообщении после выхода из системы. Студенты продолжали отправлять друг другу ссылки на страницу выхода с сообщениями вроде «вы вышли из системы, потому что толстые люди здесь не допускаются» и такие (например, мини-ссылки). – Renan

2

Вы не можете.

Перенаправления - это функция HTTP; выполнение перенаправления полностью пропускает вашу страницу.

Вместо этого вы можете использовать больше Javascript для выполнения перенаправления на стороне клиента после предупреждения.
В частности, установить location.href.

+0

Какой браузер может блокировать. Моя специальность всегда всплывает под вопросом, спрашивает, хочу ли я взять туда, где сценарий пытается вести меня, и я в основном всегда говорю «нет». – Renan

+0

@Renan: Я никогда не видел, чтобы браузер делал это. Какой браузер вы используете? – SLaks

+0

Я использую FireFox и Chrome. Существуют расширения и плагины, которые позволяют пользователю точно настроить способ, которым он хочет заниматься переадресацией. – Renan

3

Response.Redirect устанавливает заголовок Location, который браузер видит и работает до того, как он увидит любой контент на странице. Если вы хотите, чтобы страница действительно выполнялась, вы должны разрешить им сначала перейти на страницу, а не просто перенаправить их.

Пример:

Запрос клиента:

GET /Utilities.aspx HTTP/1.0 
Host: www.somehost.com 
User-Agent: Mozilla/4.0 (Windows XP) 
Accept: text/html, */* 

ответ сервера:

HTTP 300 OK 
Location: /SomeNewPage.aspx  <-- Browser see this and goes 
Content-Length: 12345 

<html>       <-- ignores from here down 
    ... 
    <script>alert('You\'re being redirected');</script> 
    ... 
</html> 

Новый клиент Запрос:

GET /SomeNewPage.aspx HTTP/1.0 
Host: www.somehost.com 
User-Agent: Mozilla/4.0 (Windows XP) 
Accept: text/html, */* 
... 
+0

Очень хорошее объяснение .. Большое спасибо – Pranav

+0

Лучший ответ. + 1. –

1

Я с @ClaudioRedi на этом. Единственный способ сделать это через JavaScript:

  • Может быть заблокирован браузером, даже если JavaScript включен;
  • Обязательно откроется защитное отверстие.

Мое предложение состоит в том, что у вас есть это оповещение после загрузки целевой страницы.

+0

Я никогда не видел, чтобы браузер блокировал это, и это не откроет дыру в безопасности (если вы не избежите строки) – SLaks

0

Попробуйте использовать

ClientScript.RegisterStartupScript(Page.GetType(), "", script,true); 

Не

this.GetType() 

но

Page.GetType() 
+0

Простите, я пробовал, но это не сработало. – Animesh

0

Вместо Redirect, вы можете попробовать, как это: -

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
       sb.Append("<script language='javascript'>"); 
       sb.Append("alert('hello');window.location.href=\"page2.aspx\""); 
       sb.Append("</script>"); 

ClientScript.RegisterStartupScript(typeof(Page), "anything", sb.ToString(), true); 
0

Вам необходимо использовать переадресацию на другую страницу на стороне клиента.

if (authorizedUser.ToLower() != "admin") 
    { 
     if (!ClientScript.IsClientScriptBlockRegistered("UnauthorizedUserRedirect")) 
     { 
    ClientScript.RegisterStartupScript(this.GetType(), "UnauthorizedUserRedirect", "alert('Unauthorized access!\n\nYou have attempted to access a page that you are not authorized to view.'); window.location.href = 'Default.aspx';", true); 

     } 
    } 
0

попробовать это в JavaScript функции после предупреждения добавить

top.location='default.aspx'; 

Теперь ваш код

if (authorizedUser.ToLower() != "admin") 
{ 
    if (!ClientScript.IsClientScriptBlockRegistered("UnauthorizedUserRedirect")) 
    { 
     ClientScript.RegisterStartupScript(this.GetType(), "UnauthorizedUserRedirect", "<script>alert('Unauthorized access!\n\nYou have attempted to access a page that you are not authorized to view.');top.location='Default.aspx';</script>", true); 

    } 
}