Nancyfx Razor查看如何根据用户角色显示或隐藏元素

时间:2014-11-04 10:59:20

标签: forms authentication roles elements nancy

我正在玩Nancy和Forms身份验证。我有一个布局视图,显示登录或注销链接,具体取决于用户是否经过身份验证:

 @if (@Html.RenderContext.Context.CurrentUser.IsAuthenticated())
            {
                <p><small><span style="padding-right:15px"><em>@Html.RenderContext.Context.CurrentUser.UserName</em></span>
                    <a href="@Url.Content("~/logout")">Logout</a></small></p>
            }
            else
            {
                <p><small><a href="@Url.Content("~/login")">Login</a></small></p>
            }

在我的应用程序中,我将只有那些具有正确角色的人才能看到这些元素。 我的问题是这个。处理这个问题的最佳方法是什么?我应该检查视图中的角色然后显示/隐藏元素,还是在模块中根据用户角色显示不同的视图?

1 个答案:

答案 0 :(得分:1)

我最终在布局中使用部分视图,根据权限提供不同的导航部分。

@if (@Html.RenderContext.Context.CurrentUser.IsAuthenticated())
     {
        if (@Html.RenderContext.Context.CurrentUser.Claims.Contains("Admin"))
        {
            @Html.Partial("Views/Partials/_AdminMenu")
        }
        else if (@Html.RenderContext.Context.CurrentUser.Claims.Contains("Editor"))
        {
            @Html.Partial("Views/Partials/_EditorMenu")
        }
         else if (@Html.RenderContext.Context.CurrentUser.Claims.Contains("Viewer"))
        {
            @Html.Partial("Views/Partials/_ViewerMenu")
        }
         else
         {
            @Html.Partial("Views/Partials/_PublicMenu")
         }
     }
     else
     {
         @Html.Partial("Views/Partials/_PublicMenu")
     }

如果存在重大差异,我会从模块中呈现不同的视图,并且如果到达他们不应该的地方,则将用户发送到“权限被拒绝”类型视图。

我发现这会将用户重定向到被拒绝的视图。在模块顶部添加一个挂钩。

 public class EditUserRoleModule : NancyModule
    {
        public EditUserRoleModule()
        {
        // add an after hook to send the user to access denied if they are NOT admin
        After += context =>
        {
            if (context.Response.StatusCode == HttpStatusCode.Forbidden)
                context.Response = this.Response.AsRedirect("/denied");
        };

        this.RequiresAnyClaim(new[] { "admin" });