![](/img/trans.png)
[英]ASP.NET MVC web application access and modify database recurrently best practice
[英]Best practice to query access rights in ASP.NET MVC application
我正在创建一个ASP.NET MVC4应用程序,该应用程序具有一个左侧的菜单面板,而右侧的主面板将是内容面板。 ( @RenderBody
)
菜单上的链接是根据用户的登录角色生成的。 例如,具有较高访问权限的用户将在菜单上看到更多链接。 这些访问权限存储在数据库中。
我有一个_Layout.cshtml
页面,所有页面都继承自该页面。
我应该如何编写访问菜单,以便在登录期间仅从数据库中检索一次访问? 之后,用户导航到的每个页面,我都不必重新查询数据库的访问权限。
我应该在访问菜单页面上使用Html.RenderAction
还是Html.Partial
吗?
您可以在共享文件夹中定义一个名为“ Navigation.cshtml”的局部视图。 在_Layout.cshtml中,您可以像
<div id="left-menu">
@Html.Partial("Navigation")
</div>
和您的Navigation.cshtml应该看起来像
@if(Request.IsAuthenticated) {
// show links for authenticated user.
}
else {
// show links for non-authenticated user.
}
您的RenderAction
想法在逻辑上是正确的。 只需将OutputCache
与VaryByCustom
添加在一起,就可以在其中检查角色并且不访问每个页面和用户的数据库。
可以帮助您的链接:
我想说,最简单的方法是使用MVCSiteMapProvider ,您可以使用NuGet将其添加到项目中。
它具有一个选项securityTrimmingEnabled
,它将自动从站点地图(因此从菜单)中删除用户无权查看的项目。
我应该如何编写访问菜单,以便在登录期间仅从数据库中检索一次访问?
您应该使用RoleProvider获得角色。 如果您拥有自己的角色数据库模式,则可能需要编写一个自定义角色提供程序。 定制角色提供程序可以实现缓存以避免过多地访问数据库,或者,如果角色不太多,则可以使用CacheRolesInCookie属性。
然后在要保护的控制器和操作上放置一个Authorize
属性:
[Authorize(Roles="SomeRole")]
public ActionResult MyAction()
{
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.