如何使用mvcSiteMapProvider实现安全性?

时间:2013-08-23 13:11:36

标签: asp.net-mvc asp.net-mvc-3 mvcsitemapprovider asp.net-mvc-sitemap

我需要使用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 个答案:

答案 0 :(得分:10)

默认情况下不启用安全修整。你需要做的第一件事就是打开它。

内部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();
    }
}

XML中的roles属性是为了向后兼容ASP.NET。对于MVC,唯一真正的安全性是使用[Authorize]属性(或通过继承它自己的方案),因为它是保证资源无法通过备用路由访问的唯一方法。

答案 1 :(得分:1)

在SOUController上,您是否在某处添加了[Authorize]属性? MvcSiteMapProvider使用它来确定ACL。

答案 2 :(得分:0)

如果您使用站点地图,您可以/必须(上述方法对我不起作用)在站点地图中指定角色。

<mvcSiteMapNode title="Rechnungen" controller="Customer/Bills" action="Index" roles="CompanyAdmin"/>

答案 3 :(得分:0)

我只是把

 <add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>

在Web.config的appSettings中,如下所示:

<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();
    }
 }

然后OK!