Реализация политик в основном представлении .net пользовательских представлений «Отказано в доступе» - PullRequest
0 голосов
/ 29 марта 2019

Я создаю приложение, в котором я пытаюсь использовать политики для контроля доступа моих пользователей.

Если они создали учетную запись, они должны получить одобрение администратора. Таким образом, они будут встречены моим пользовательским представлением AccessDenied.cshtml при первом входе в систему. Эта часть прекрасно работает:

services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder().
            RequireAuthenticatedUser().
            RequireRole("AuthenticatedUser").
            Build();
            options.Filters.Add(new AuthorizeFilter(policy));
            options.Filters.Add(new RequireHttpsAttribute());                

        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Теперь мне нужен еще один фильтр, который проверяет другой набор ролей и возвращает другое, специально созданное представление «AccessDenied».

Возможно ли это как-нибудь? Я знаю, что могу просто вставить другую RequireRole («роль»), но тогда они встретятся с той же страницей с отказом в доступе.

1 Ответ

0 голосов
/ 30 марта 2019

После нескольких хитростей я наконец нашел приемлемый способ решения этой проблемы. Это заняло несколько шагов, но на случай, если кому-то еще это понадобится, я просто задокументирую, что я сделал:

1

Добавьте обе роли к вашей политике в файле запуска и добавьте пользовательский путь к доступу, находящемуся выше вашего вызова .Addmvc:

services.PostConfigure<CookieAuthenticationOptions>(IdentityConstants.ApplicationScheme,
            opt =>
            {
                opt.AccessDeniedPath = $"/Home/AccessDeniedCustom";
            });

 services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder().
            RequireAuthenticatedUser().
            RequireRole("AuthenticatedUser").
            RequireRole("Your2ndRole").
                Build();
            options.Filters.Add(new AuthorizeFilter(policy));
            options.Filters.Add(new RequireHttpsAttribute());
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  1. Теперь мы получим наш пользовательский вид отказа в доступе, если мы будем выполнять какую-либо роль, но это все еще только одна страница отказа в доступе для обеих ролей.

Мы перейдем к нашему представлению AccessDeniedCustom и используем синтаксис Razor для визуализации представления. В основном у меня есть два полных представления в файле представления, и я использую кое-что из следующего, чтобы решить, какой визуализировать:

@{
ViewData["Title"] = "AccessDeniedCustom";
var user = Context.User;
}

@if (!user.IsInRole("AuthenticatedUser")){ //Show some html }
else{ //show some different html}

Убедитесь, что вы добавили [AllowAnonymous] в ваш новый, настраиваемый режим просмотра «Отказано в доступе», иначе вы не доберетесь слишком далеко.

...