Как перенаправить пользователей на страницу ASP.NET, если не авторизован? - PullRequest
21 голосов
/ 29 января 2011

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

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

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

Ответы [ 6 ]

24 голосов
/ 06 августа 2011

На 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 голосов
/ 25 января 2015

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

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

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

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

1 голос
/ 30 января 2011

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

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

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

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

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

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

1 голос
/ 29 января 2011

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

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

0 голосов
/ 19 мая 2013

попробуйте это:

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

}
0 голосов
/ 29 января 2011

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

<system.web>
  <customErrors mode="On">        
    <error statusCode="403" redirect="AuthError.aspx" />      
  </customErrors>
</system.web>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...