В ASP.NET Core 2 Microsoft довольно настойчиво заявляет, что все задачи авторизации выполняются с использованием политик и требований . Используя самый простой пример, который я могу придумать:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", p => p.RequireAssertion(a => false));
});
}
}
Выше я добавляю политику с утверждением, которое всегда терпит неудачу вместо полного требования, просто чтобы проиллюстрировать мою точку зрения. А ниже приведен простой контроллер с двумя действиями, в котором доступ ко второму запрещен вышеуказанной политикой.
public class HomeController : HomeController
{
public IActionResult Allow() => View();
[Authorize("MyPolicy")]
public IActionResult Deny() => View();
}
Этот вид работает как ожидалось. Мне действительно отказано в доступе ко второму действию, но я перенаправлен на https://localhost:44331/Account/AccessDenied?ReturnUrl=%2FHome%2FDeny
.
Насколько я могу судить, я на самом деле не сказал своему приложению, куда отправлять пользователей, когда требования политики не выполнены, и я не могу понять, как это сделать.
Как мне указать, куда следует перенаправлять пользователя, когда требование не выполнено? Кроме того, можно ли перенаправить в разные места в зависимости от политики / требования?
UPDATE:
Просто чтобы прояснить ситуацию, я использую ASP.NET Core Identity в своем приложении. И ответом на первую часть моего вопроса является установка свойства AccessDeniedPath
при настройке файла cookie приложения:
services.ConfigureApplicationCookie(o =>
{
o.AccessDeniedPath = "/Some/Path";
});
Но это означает, что я застрял, перенаправляя на одну и ту же страницу независимо от того, какой политике / требованию запрещен доступ. Есть ли способ решить, куда перенаправить на основе политики или требования?