2011-01-29 4 views
20

Мне нужно, чтобы мои пользователи перенаправлялись на страницу AuthError.aspx («У вас нет доступа к этой странице») в случае, если они аутентифицированы, но попытайтесь получить доступ к странице, к которой у них нет доступа (из-за роли для экзамен). Если настроить web.config так:Как перенаправить пользователей на страницу ASP.NET, если они не авторизованы?

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
</authentication> 

это неправильно поведение системы, поскольку пользователь уже заверен и нет необходимости перенаправить его или ее на эту страницу. Но если я напишу здесь AuthError.aspx вместо Login.aspx, как я могу перенаправить еще не аутентифицированного пользователя на страницу входа?

+2

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

+0

Отметьте это сообщение. http://stackoverflow.com/questions/14731707/redirect-user-to-another-page-from-web-config-when-his-role-has-not-enough-permi?rq=1 – Nishant

ответ

1

Вам нужно:

1) включить роли (в web.config): (заменить 'XXX' с собственными значениями)

<roleManager enabled="true"> 
    <providers> 
    <clear /> 
    <add connectionStringName="ApplicationServices" applicationName="xxx" 
     name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
    <add applicationName="xxx" name="AspNetWindowsTokenRoleProvider" 
     type="System.Web.Security.WindowsTokenRoleProvider" /> 
    </providers> 
</roleManager> 

2) вам необходимо ограничить доступ к определенным областям вашего веб-сайта для определенных ролей. Я действительно ответил на другой вопрос сегодня, где я объясняю, как этого добиться. Here ссылка

+0

Спасибо, но все это уже сделано. Возможно, я описал неправильно, но проблема в том, что я использую роли и файлы локальных веб-конфигураций для защиты папок, но я не знаю, как перенаправить пользователя, который пытается получить доступ к недоступной папке, на соответствующую страницу AuthError.aspx. – mimic

-1

Вы можете установить страницу ошибки следующим образом:

<system.web> 
    <customErrors mode="On">   
    <error statusCode="403" redirect="AuthError.aspx" />  
    </customErrors> 
</system.web> 
+1

К сожалению, это не сработает. Если я его использую, он снова открывает страницу входа, а просто перенаправляет на AuthError.aspx = ( – mimic

1

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

Как рекомендует @santiagoIT, роли могут быть лучшим решением для реализации необходимой вам авторизации. Некоторые элементы управления, такие как LoginView, обладают поддержкой ролей и аутентификации, поэтому вы можете использовать их для отображения различного контента в зависимости от роли, в которой находится пользователь.

Общим подходом является отображение различных меню пользователям разные роли, так что они представлены только с меню, которые имеют отношение к их ролям - для этого часто используется LoginView.

В качестве альтернативы вы можете контролировать видимость содержимого на отдельных страницах, снова используя LoginView, чтобы пользователи, не прошедшие проверку подлинности, получили одно сообщение, те, кто прошел проверку подлинности, но не разрешили просматривать страницу вторым сообщением, а также тем, кто оба аутентифицируются и позволяют просматривать страницу, просматривая содержимое.

Если вы просто хотите перенаправить пользователя, который прошел аутентификацию, но не имеет необходимого доступа для просмотра страницы, вы также можете проверить, что пользователь является соответствующей ролью (Roles.IsUserInRole) и перенаправлен на «You нет доступа .. "страница если нет.

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

+0

Спасибо за ответ, но я предпочитаю не кодировать это поведение, а реализовывать его с помощью web.config. Конечно, я могу проверить доступность внутри код, но я хотел бы сделать это, используя только web.config. – mimic

23

На Page_Load вашей страницы входа в систему, вы хотите, чтобы проверить, если пользователь прошел проверку подлинности, и если они перенаправить их на ваш доступ запрещен страницы:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) // if the user is already logged in 
    { 
      Response.Redirect("~/AccessDenied.aspx"); 
    } 
} 

Если вы хотите получить вы можете проверить параметр ReturnUrl, чтобы определить, пришел ли пользователь непосредственно на страницу (например, через закладку, сохраненную на странице входа в систему) и обрабатывать ее по-разному.Вот пример:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 

      // if they came to the page directly, ReturnUrl will be null. 
      if (String.IsNullOrEmpty(Request["ReturnUrl"])) 
      { 
       /* in that case, instead of redirecting, I hide the login 
        controls and instead display a message saying that are 
        already logged in. */ 
      } 
      else 
      { 
      Response.Redirect("~/AccessDenied.aspx"); 
      } 
     } 
    } 
+3

+1 Coz это решение будет работать. Но это лучшее решение? – Ananth

+0

Отлично - отлично работает. Спасибо. –

+0

Это лучшее, что я нашел до сих пор –

0

попробовать это:

Предположим, вам нужно только пользователям администратора для доступа к указанной страницы твоего, то в Page_Load вы могли бы написать это:

if (User.Identity.IsAuthenticated) 
{ 
    if (!User.IsInRole("Admin")) 
    { 
     Server.Transfer("~/AccessDeniedPage.aspx"); 
    } 

} 

и в случае вы используете маршруты, которые вы могли бы сделать:

if (User.Identity.IsAuthenticated) 
{ 
    if (!User.IsInRole("Admin")) 
    { 
     Response.RedirectToRoute("AccessDeniedRoute"); 
    } 

} 
1

Для меня наименее хлопот наиболее выгоден solutio n этой проблеме было создание другого раздела (панели) на странице Login.aspx с содержимым, которое будет отображаться для пользователей, прошедших проверку подлинности (например, вошел в систему), говоря «Доступ запрещен» вместо формы входа. Когда пользователь регистрируется на странице пользователя, это означает, что они, скорее всего, оказались здесь, потому что они не прошли аутентификацию для доступа к странице, которая перенаправила их здесь.

На странице входа в систему я использую этот очень простой код для переключения видимости панели и форма входа:

if (Request.IsAuthenticated) 
{ 
    LoginUser.Visible = false; 
    AccessDeniedPanel.Visible = true; 
} 

это очень просто, и это работает.

Смежные вопросы

 Смежные вопросы