Определите, может ли пользователь получить доступ к запрошенной странице?

StackOverflow https://stackoverflow.com/questions/1048492

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть веб-сайт ASP.Net с несколькими ролями, каждая из которых имеет доступ к отдельному каталогу (т. е.пользователи с правами администратора могут получить доступ к /admin, покупатели могут получить доступ к /shop и т. д.), используя общую страницу входа.Если кто-то посещает страницу входа с URL-адресом возврата, установленным на каталог, к которому у него нет доступа (например,покупатель посещает /login.aspx?returnurl=/admin/index.aspx), пользователь может успешно пройти аутентификацию (учетные данные для входа действительны), но в конечном итоге он снова оказывается на странице входа (у него нет доступа к этой странице) они просили).

Как мне это узнать, чтобы отобразить сообщение пользователю?

Это было полезно?

Решение 2

В итоге я сделал это в событии page_load на странице входа:

if (User.Identity.IsAuthenticated)
{
    LoginErrorDetails.Text = "You are not authorized to view the requested page";
}

Суть в том, что если аутентифицированный пользователь попадает на страницу входа, то он либо был отправлен на страницу входа в систему в результате попытки получить доступ к странице, на просмотр которой у него нет прав, либо он прошел аутентификацию и затем вручную перешел на страницу входа. (вряд ли).

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

Другие советы

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

это то, что вам нужно использовать для проверки доступа пользователей к местоположению (странице или папке) ( http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

Один из подходов — переопределить OnLoad ваших форм aspx и проверить, разрешен ли аутентифицированному пользователю доступ к ресурсу на основе роли.Итак, вы создаете BasePage.cs (в котором вы определяете класс BasePage, который наследуется от System.Web.UI.Page), например, от которого наследуются все ваши формы (aspx), в котором вы делаете это:

protected override void OnLoad(EventArgs e)
{
    InitializeSitemap();
    if (SiteMap.CurrentNode != null)
    {
        if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode)))
        {
            // You can redirect here to some form that has a custom message
            Response.Redirect("~/Forms/Logout.aspx");

            return;
        }
    }
    base.OnLoad(e);
}

Затем в вашем классе UrlHelper вам понадобится функция IsAccessible, использованная выше:

public static bool IsAccesible(SiteMapNode node)
{
    bool toRole = false;

    foreach (string role in node.Roles)
    {
        if (role == "*" || HttpContext.Current.User.IsInRole(role))
        {
            toRole = true;
        }
    }

    return toRole;
}

Вот IsAnonymousAllowed, если вам интересно:

public static bool IsAnonymousAllowed(SiteMapNode node)
{
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}

Если у вас разные каталоги и вы используете аутентификацию asp.net, это очень просто.Все, что вам нужно, это поместить файл web.config в каждый каталог и определить роли, которые могут получать доступ к файлам в этом каталоге, например:

<authorization>
    <allow roles="shoppers"/>
    <deny  users="?"/>
</authorization>

Более подробную информацию вы можете получить от этот статья в MSDN

Вы можете установить все в основном файле web.config следующим образом:

    <!-- Configuration for the "sub1" subdirectory. -->
      <location path="sub1">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1" type="Type1"/>
            <add verb="*" path="sub1" type="Type2"/>
          </httpHandlers>
        </system.web>
      </location>

      <!-- Configuration for the "sub1/sub2" subdirectory. -->
      <location path="sub1/sub2">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1/sub2" type="Type3"/>
            <add verb="*" path="sub1/sub2" type="Type4"/>
          </httpHandlers>
        </system.web>
      </location>
    </configuration>

Это из этот статья на MSDN :)

РЕДАКТИРОВАТЬ:

В методе загрузки страницы сделайте следующее:

if(!User.IsInRole("shopper"))
{
    lblNoAccess.Visible=true;
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}

Надеюсь, это вам поможет!

Вы можете перенаправить его на индексную страницу, сообщив ему, что он не может получить доступ к этой странице;)

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

РЕДАКТИРОВАТЬ:Вероятно, вы могли бы выполнить перенаправление в событии LoggedIn элемента управления.

Еще один вариант — установить переменную сеанса при проверке прав и отобразить ее на странице входа.

Итак, вы можете сделать:

if(!User.IsInRole("shopper"))
{
    session("denied") = "You don't have access to shop";
    response.redirect("/login");
}

Затем на странице входа:

if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top