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

Поскольку Modernizr не обнаруживает IE10 в Windows Phone 8 / WinRT, простое кросс-браузерное решение выглядит следующим образом:

var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;

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

7
задан user9659 26 June 2009 в 10:55
поделиться

6 ответов

Я закончил тем, что сделал это в событии page_load страницы входа в систему:

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

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

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

2
ответ дан 6 December 2019 в 12:53
поделиться

Один из подходов - переопределить 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;
}
1
ответ дан 6 December 2019 в 12:53
поделиться

Если у вас разные каталоги и вы используете аутентификацию 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";
}

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

1
ответ дан 6 December 2019 в 12:53
поделиться

Еще один вариант - установить переменную сеанса, когда вы проверяете права, и отображать ее на странице входа.

Таким образом, вы можете сделать:

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") = "";
}
0
ответ дан 6 December 2019 в 12:53
поделиться

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

0
ответ дан 6 December 2019 в 12:53
поделиться

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

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

0
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: