Подтвердить что ты не робот

Как перенаправить пользователей на страницу ASP.NET, если они не авторизованы?

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

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

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

4b9b3361

Ответ 1

На странице 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");
            }
        }
    }

Ответ 2

Вам необходимо:

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) вам необходимо ограничить доступ к определенным областям вашего веб-сайта для определенных ролей. Сегодня я ответил на другой вопрос, где объясню, как этого добиться. Здесь есть ссылка

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

Он мертв просто и работает.

Ответ 5

попробуйте следующее:

Предположим, вам нужны только пользователи-администраторы для доступа к указанной странице, а затем в 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");
   }

}

Ответ 6

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

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