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