Ядро 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.

Ответ 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

Я не рекомендовал бы решение Сержа Сагана на примере реальной жизни. Это отлично работает при разработке, но для реального приложения, используемого различными типами пользователей, которое может вводить в заблуждение. Давайте посмотрим на сценарий ниже

  1. Я аутентифицировался б
  2. Я знаю URL для конкретной страницы
  3. Я не авторизован для доступа к этим страницам

Это означает, что я буду перенаправлен на страницу входа в систему, как если бы я не проходил проверку подлинности, а это не так. Я бы пошел больше с решением mxmissile

Лично я использую AddMvcCore, но вам нужно добавить AddRazorViewEngine, если вы используете виды бритвы и AddRazorPages, если вы используете страницы бритвы

        services.AddMvcCore(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();