У нас есть полностью работающая карта сайта со многими сотнями узлов, настроенных с атрибутами sitemap для действий. Эти узлы - это исправление безопасности, отлично работающее на основе требований. Все работает отлично и быстро.Безопасность Обрезка MVC сайтов поставщика Sitemap с атрибутом AuthAttribute на основе значений маршрута
Теперь у нас есть требование, чтобы определенные страницы были недоступны на основе значения маршрута. В основном скрываются ссылки на меню mvc на основе значения personId в маршруте. Используя код:
//Just proof of concept - people restricted will be from a service
public class PersonAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.RequestContext.RouteData.Values.ContainsKey("personId"))
{
return base.AuthorizeCore(httpContext);
}
var personId = httpContext.Request.RequestContext.RouteData.Values["personId"].ToString();
int value;
int.TryParse(personId, out value);
if (value != 0 && value == 3708)
{
return false;
}
return base.AuthorizeCore(httpContext);
}
}
Это работает отлично с точки зрения предотвращения доступа. Однако, в отличие от остальной части нашего сайта, карта сайта не работает с этим. Если я посещаю человека, который ограничен первым, он скрывает узел для этого человека и всех остальных. Если я нахожусь с не скрытым человеком, то узел будет видимым для всех, но я получаю отказ в доступе для человека, если я попытаюсь посетить их узел.
Я предполагаю, что это связано с тем, что узел не имеет концепции обрезки на основе значений маршрута.
Любые идеи о том, как это можно реализовать. Мы пытаемся внедрить более гибкую модель безопасности.
Спасибо. Мы размещаем атрибут только на узлах с идентификатором personId. Мы действительно обеспечиваем уровень данных, а также визуальную вещь - например, вы можете увидеть дисциплинарное замещение человека, если будете управлять ими, но нет, если вы этого не сделаете. Фактически мы ограничиваем доступ к некоторым людям для некоторых пользователей. Контекст не позволит вам получать данные, поскольку он обеспечивает уровень контекста на основе IClaimsPrincipal, и вы просто не получите никаких данных. Таким образом, страница будет бросать ошибку, не найденную в записи (не подходит для конечного пользователя). Просмотрите ваш всегда полезный совет. – GraemeMiller
Это AuthorizeAttributeAclModule, который работает для вашего использования: https://gist.github.com/NightOwl888/30bef95ee9dd0b24c870. Я хотел бы сделать что-то подобное официально, но в этой версии отсутствуют некоторые фундаментальные части HttpContext (сеанс, профиль и т. Д.). Это потребует еще много работы, чтобы все это было в единый сплоченный контекст, который можно использовать для общего использования, но я считаю, что это можно сделать, связав эти зависимости с конструктором SiteMapHttpContext. – NightOwl888
Очень ценим, что он работает. Просто нужно было обновить наш кеширующий декоратор, чтобы кэш-ключ добавил его personId, если он был частью значений маршрута. Считаете ли вы, что это лучший подход для ограничения видимости этих узлов? – GraemeMiller