После нескольких хитростей я наконец нашел приемлемый способ решения этой проблемы.
Это заняло несколько шагов, но на случай, если кому-то еще это понадобится, я просто задокументирую, что я сделал:
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);
- Теперь мы получим наш пользовательский вид отказа в доступе, если мы будем выполнять какую-либо роль, но это все еще только одна страница отказа в доступе для обеих ролей.
Мы перейдем к нашему представлению AccessDeniedCustom и используем синтаксис Razor для визуализации представления. В основном у меня есть два полных представления в файле представления, и я использую кое-что из следующего, чтобы решить, какой визуализировать:
@{
ViewData["Title"] = "AccessDeniedCustom";
var user = Context.User;
}
@if (!user.IsInRole("AuthenticatedUser")){ //Show some html }
else{ //show some different html}
Убедитесь, что вы добавили [AllowAnonymous] в ваш новый, настраиваемый режим просмотра «Отказано в доступе», иначе вы не доберетесь слишком далеко.