如何在页面加载时设置MVCSitemapnode角色属性?

时间:2015-06-22 16:16:54

标签: c# asp.net-mvc mvcsitemapprovider

所以我有一个mvcsitemap:

open(5, file=trim(filename))

我想要做的是当网站加载时我想设置"角色"每个节点的属性与数据库中的值相关联。例如:

我希望可以从角色访问Home节点:Admin,User 我希望可以从角色访问Page2节点:用户

2 个答案:

答案 0 :(得分:2)

根据documentation,roles属性用于ASP.NET的iteroperability。它不应该用于MVC安全性,主要是因为MVC不保护物理页面,而是MVC保护资源(通常是控制器动作)。 ASP.NET安全方案基于底层文件系统,因此完全不适合与MVC一起使用。

MVC安全性基于AuthorizeAttribute。您可以将AuthorizeAttribute子类化以提供所需的任何安全方案,包括在每次往返时从数据库中读取设置(如果这是您真正想要的)。有关此类方法,请参阅this article

但请注意,默认的AuthorizeAttribute实现支持控制器操作的角色和用户,这将是一个性能更好的解决方案。

[Authorize(Roles="Administrators,SuperUsers")]
public ActionResult ChangePassword(ChangePasswordModel model)
{
    ...
}

一旦您将安全性建立在AuthorizeAttribute(或AuthorizeAttribute的子类)上,MvcSiteMapProvider就会自动与之互动。您唯一需要做的就是turn on security trimming

内部DI(web.config)

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

外部DI(MvcSiteMapProvider模块)

bool securityTrimmingEnabled = true; // Near the top of the module

答案 1 :(得分:1)

不确定你看起来是什么,但你能在你的视野中做一个条件吗?像这样

 @if (this.User.IsInRole("Admin")){ <mvcSiteMapNode title="Page2"
 controller="Page2" action="Index"/>} else
 if(this.User.IsInRole("User"))....