Поскольку Modernizr не обнаруживает IE10 в Windows Phone 8 / WinRT, простое кросс-браузерное решение выглядит следующим образом:
var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
Вам нужно проверять только один раз, так как устройство не будет внезапно поддерживать или не поддерживает касание, поэтому просто сохраните его в переменной, чтобы вы могли использовать его несколько раз более эффективно.
Я закончил тем, что сделал это в событии page_load страницы входа в систему:
if (User.Identity.IsAuthenticated)
{
LoginErrorDetails.Text = "You are not authorized to view the requested page";
}
Думаю, что если аутентифицированный пользователь попадает на страницу входа в систему, он либо был отправлен в результате попытки доступа к странице, которой он является не авторизованы для просмотра, или они прошли аутентификацию, а затем вручную перешли на страницу входа в систему (маловероятно).
Дальнейшим действием будет отправка пользователя на соответствующую домашнюю страницу всякий раз, когда они посещают страницу входа, если они уже аутентифицирован.
Один из подходов - переопределить 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";
}
Надеюсь, это поможет ты!
Еще один вариант - установить переменную сеанса, когда вы проверяете права, и отображать ее на странице входа.
Таким образом, вы можете сделать:
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") = "";
}
Вы можете перенаправить его на страницу индекса, сообщив ему, что он не может получить доступ к этой странице;)
А почему бы вам не поймать каталог на странице входа? Если страница входа может определить, к какому каталогу пользователь пытается получить доступ, возможно, они смогут перенаправить на нужную страницу в зависимости от роли. Если кто-то пытается перейти в / admin и аутентификация проходит успешно, вы можете проверить, есть ли у него доступ к нему. Если нет, вы можете либо перенаправить на базовую целевую страницу, указав, что у них нет доступа, либо перенаправить их на целевую страницу роли.
РЕДАКТИРОВАТЬ: Вероятно, вы могли бы выполнить перенаправление в событии LoggedIn элемента управления.