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