Реализация политик в представлениях с отказом в пользовательском доступе в .net core view

#c# #asp.net-mvc #asp.net-core #asp.net-identity

#c# #asp.net-mvc #asp.net-core #asp.net-identity

Вопрос:

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

Если пользователь создал учетную запись, ему необходимо получить одобрение администратора. Таким образом, они будут встречены моим пользовательским представлением 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);
  

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

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

Ответ №1:

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

1.

Добавьте обе роли в свою политику в файле запуска и добавьте пользовательский путь к accessden, УКАЗАННЫЙ ВЫШЕ вашего .Вызов 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. Теперь мы получим наше пользовательское представление с отказом в доступе, если у нас есть любая роль, но это все еще только 1 страница с отказом в доступе для обеих ролей.

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

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

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

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