繁体   English   中英

在ASP.NET MVC应用程序中查询访问权限的最佳实践

[英]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想法在逻辑上是正确的。 只需将OutputCacheVaryByCustom添加在一起,就可以在其中检查角色并且不访问每个页面和用户的数据库。

可以帮助您的链接:

我想说,最简单的方法是使用MVCSiteMapProvider ,您可以使用NuGet将其添加到项目中。

它具有一个选项securityTrimmingEnabled ,它将自动从站点地图(因此从菜单)中删除用户无权查看的项目。

我应该如何编写访问菜单,以便在登录期间仅从数据库中检索一次访问?

您应该使用RoleProvider获得角色。 如果您拥有自己的角色数据库模式,则可能需要编写一个自定义角色提供程序。 定制角色提供程序可以实现缓存以避免过多地访问数据库,或者,如果角色不太多,则可以使用CacheRolesInCookie属性。

然后在要保护的控制器和操作上放置一个Authorize属性:

[Authorize(Roles="SomeRole")]
public ActionResult MyAction()
{
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM