Как реализовать безопасность с помощью 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();
    }
 }

тогда хорошо!

Другие вопросы по тегам