Ядро ASP.NET, изменение перенаправления по умолчанию для несанкционированного доступа
Я пытаюсь перенаправить на другой URL-адрес для входа в ASP.NET MVC6
Метод входа в мой контроллер учетной записи имеет атрибут Route
для изменения URL-адреса.
[HttpGet]
[AllowAnonymous]
[Route("login")]
public IActionResult Login(string returnUrl = null)
{
this.ViewData["ReturnUrl"] = returnUrl;
return this.View();
}
При попытке получить доступ к неустранимой странице я перенаправлен на неверный URL-адрес, он должен быть только /login
, но вместо этого я получаю http://localhost/Account/Login?ReturnUrl=%2Fhome%2Findex
Я настроил путь аутентификации cookie следующим образом:
services.Configure<CookieAuthenticationOptions>(opt =>
{
opt.LoginPath = new PathString("/login");
});
Я добавил фильтр по умолчанию, чтобы гарантировать, что все URL-адреса требуют аутентификации по умолчанию.
services.AddMvc(
options =>
{
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
});
Я проверил, что url /login
действительно загружает страницу входа, тогда как /account/login
нет, как и ожидалось.
edit: Я оставил маршруты как есть (кроме изменения контроллера и действия по умолчанию)
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Site}/{action=Site}/{id?}");
});
Ответы
Ответ 1
Если вы UseIdentity
здесь метод расширения UseIdentity
то заметите, что он использует IdentityOptions
не CookieAuthenticationOptions
, поэтому вместо этого вы должны настроить IdentityOptions
:
services.Configure<IdentityOptions>(opt =>
{
opt.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
});
редактировать
Для asp.net core 2.0: параметры cookie Identity больше не являются частью IdentityOptions. Проверьте ответ mxmissile.
Ответ 2
С asp.net core 2.0
теперь это изменилось на:
services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn");
Подробнее о миграции на 2.0 здесь. И еще больше информации о переходе с 2.0 на 2.1.
Ответ 3
ОБНОВЛЕНИЕ: Начиная с ядра 2.1.x с точечной сетью, идентификационные данные создаются из SDK. Чтобы подписать ответ @mxmissile, можно указать путь. Чтобы осуществить трюковый путь, используйте расширенную маршрутизацию или перенаправления. Идентификация лесов
Ответ 4
Вы также можете попробовать использовать StatusCodePages
:
app.UseStatusCodePages(async context => {
var response = context.HttpContext.Response;
if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
response.StatusCode == (int)HttpStatusCode.Forbidden)
response.Redirect("/Error/Unauthorized");
});
Ответ 5
Начиная с asp.net core 2.0
если вы используете куки без идентичности:
app.UseAuthentication();
// If you don't want the cookie to be automatically authenticated and assigned HttpContext.User,
// remove the CookieAuthenticationDefaults.AuthenticationScheme parameter passed to AddAuthentication.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/LogIn";
options.LogoutPath = "/Account/LogOff";
});
источник
Ответ 6
Вам нужно будет настроить это в файле startup.cs при добавлении службы аутентификации, особенно если вы используете схему аутентификации cookie.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = new PathString("/login");
});
Вот как я решил проблему, вы должны попробовать... Это определенно будет работать для вас
Ответ 7
Я не рекомендовал бы решение Сержа Сагана на примере реальной жизни. Это отлично работает при разработке, но для реального приложения, используемого различными типами пользователей, которое может вводить в заблуждение. Давайте посмотрим на сценарий ниже
- Я аутентифицировался б
- Я знаю URL для конкретной страницы
- Я не авторизован для доступа к этим страницам
Это означает, что я буду перенаправлен на страницу входа в систему, как если бы я не проходил проверку подлинности, а это не так. Я бы пошел больше с решением mxmissile
Лично я использую AddMvcCore, но вам нужно добавить AddRazorViewEngine, если вы используете виды бритвы и AddRazorPages, если вы используете страницы бритвы
services.AddMvcCore(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
.AddRazorViewEngine()
.AddAuthorization()
.AddJsonFormatters();