Нэнси Fx Razor показывает, как отображать или скрывать элементы в зависимости от ролей пользователей.

Я играю с Нэнси и аутентификацией форм. У меня есть представление макета, которое показывает ссылку для входа или выхода в зависимости от того, аутентифицирован ли пользователь:

 @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>
            }

В моем приложении у меня будут элементы, которые должны быть видны только тем, у кого есть правильная роль. Мой вопрос заключается в следующем. Каков наилучший способ справиться с этим? Должен ли я проверять роль в представлении, а затем показывать/скрывать элемент или в модуле отображать разные представления в зависимости от роли пользователя?


person Norbert Norbertson    schedule 04.11.2014    source источник


Ответы (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" });
person Norbert Norbertson    schedule 04.11.2014