Как реализовать безопасность с помощью mvcSiteMapProvider?
Мне нужно реализовать защиту ролей с помощью моего программного обеспечения mvcSiteMapProvider V4. Я использую его с MVC3.
Пример кода mvcSiteMap:
<mvcSiteMapNode roles="Admin" title="Your Subscription (All Users)" controller="SOU" action="ListSubscribers">
Это значение атрибута ролей не имеет никакого эффекта:
<mvcSiteMapNode roles="NoAdmin" title="Your Subscription (All Users)" controller="SOU" action="ListSubscribers">
Это тоже самое. Я ожидаю, что выше не будет работать, если администратор вошел в систему? Я ожидаю, что первый пример сработает, если только пользователь вошел в систему.
... но никакого эффекта.
Большое спасибо
4 ответа
Подстройка безопасности не включена по умолчанию. Первое, что вам нужно сделать, это включить его.
Внутренний DI (web.config):
<add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
Внешний DI (в модуле MvcSiteMapProvider):
bool securityTrimmingEnabled = true; // First line in the module
Затем вы должны поместить атрибут MVC [Authorize] в каждый из методов действий, которые вы хотите защитить. В MVC4+ вы также можете поместить его на уровне контроллера или зарегистрировать глобально, а затем использовать атрибут [AllowAnonymous], чтобы выборочно разрешать методы действий пользователям, не прошедшим проверку подлинности.
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizeAttribute());
}
}
[Authorize(Roles="Admin,Manager")]
public class MyController
{
// Everyone has access
[AllowAnonymous]
public ActionResult Index()
{
return View();
}
// Only Admin and Manager roles have access, everyone else is denied
public ActionResult About()
{
return View();
}
}
Атрибут role в XML предназначен для обратной совместимости с ASP.NET. Для MVC единственной реальной защитой является использование атрибута [Authorize] (или наследование его для вашей собственной схемы), поскольку это единственный способ гарантировать, что к ресурсу нельзя получить доступ по альтернативному маршруту.
На SOUController у вас есть атрибут [Authorize], добавленный куда-нибудь? MvcSiteMapProvider использует его для определения ACL.
Если вы используете карту сайта, вы можете / должны (вышеописанный подход не работал для меня) указать роли в карте сайта.
<mvcSiteMapNode title="Rechnungen" controller="Customer/Bills" action="Index" roles="CompanyAdmin"/>
Я просто положил
<add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
в appSettings Web.config, например так:
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="jqueryTheme" value="redmond" />
<add key="MvcSiteMapProvider_IncludeAssembliesForScan" value="Cost3" />
<add key="MvcSiteMapProvider_UseExternalDIContainer" value="false" />
<add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true" />
<add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
</appSettings>
и поместите атрибут [Authorize] на каждый контроллер или действие, например так:
[Authorize(Roles = "Administrator")]
public class UserManagementController : Controller
{
public ActionResult Index()
{
return View();
}
}
тогда хорошо!