mvc6 unauthorized вместо этого приводит к перенаправлению

Я пытался предотвратить перенаправление, когда я возвращаю NotAuthorized IActionResult от контроллера, но независимо от моих попыток NotAuthorized переводится в Redirect.

Я пробовал то, что упоминается здесь (та же проблема, с использованием более старой бета-версии, я использую 1.0.0-rc1-final). У меня нет пространства имен Notifications (было удалено в rc1-final).

Это мой контроллер входа в систему:

    [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                return Ok(model);
            }
            if (result.IsLockedOut)
            {
                return new HttpStatusCodeResult((int)HttpStatusCode.Forbidden);
            }
            else
            {
                return HttpUnauthorized();
            }
        }
        return HttpUnauthorized();
    }

В Startup.cs я пробовал варианты этого:

        services.Configure<CookieAuthenticationOptions>(o =>
        {
            o.LoginPath = PathString.Empty;
            o.ReturnUrlParameter = PathString.Empty;
            o.AutomaticChallenge = false;
        });

Каждый раз, когда логин не удался (пожалуйста, не обращайте внимания на то, что пароль возвращается на Ok) и должен привести к пустой странице 401, вместо этого я получаю перенаправление на / Account / Login. В чем тут фокус?


person galmok    schedule 13.01.2016    source источник
comment
Вы пытаетесь сделать это на странице входа? или это для аутентификации REST API? Если это для API, вы можете посмотреть на это: wildermuth.com/2015/9/10/ASP_NET_5_Identity_and_REST_APIs   -  person David Rinck    schedule 14.01.2016
comment
REST API, ваша ссылка предполагает, что пространство имен Notifications существует, но оно было удалено. Связанное решение больше не работает.   -  person galmok    schedule 14.01.2016


Ответы (4)


Решение состоит не в том, чтобы напрямую настраивать CookieAuthenticationOptions, а делать это через IdentityOptions следующим образом:

        services.Configure<IdentityOptions>(o =>
        {
            o.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents()
            {
                OnRedirectToLogin = ctx =>
                {
                    if (ctx.Response.StatusCode == (int)HttpStatusCode.Unauthorized)
                    {
                        return Task.FromResult<object>(null);
                    }
                    ctx.Response.Redirect(ctx.RedirectUri);
                    return Task.FromResult<object>(null);
                }
            };
        });
person galmok    schedule 14.01.2016
comment
Мне было достаточно просто использовать o.Cookies.ApplicationCookie.AutomaticChallenge = false; (перенаправления я никогда не хотел). - person Peppe L-G; 04.08.2016
comment
@ PeppeL-G Это единственное, чем я могу заняться. Огромное спасибо. - person Sloth Armstrong; 19.10.2016

Взято отсюда (Шон Вильдермут -> Идентификация ASP.NET 5 и API REST -> Комментарий «Мехди Ханафи») и протестирован API с помощью Postman

config.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents()
{
    OnRedirectToLogin = ctx =>
    {
        if (ctx.Request.Path.StartsWithSegments("/api") &&
        ctx.Response.StatusCode == 200)
        {
            ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            return Task.FromResult<object>(null);
        }
        else
        {
            ctx.Response.Redirect(ctx.RedirectUri);
            return Task.FromResult<object>(null);
        }
    }
};
person LalaBox    schedule 09.02.2016
comment
Как вообще заставить его перенаправить. Я хотел бы, чтобы у меня было перенаправление. Это не сработает. - person Sam; 18.03.2017

из Identity 2.0 вам нужно будет добавить:

using Microsoft.AspNetCore.Authentication.Cookies;

и в ConfigureServices:

services.ConfigureApplicationCookie(options =>
{
    options.Events = new CookieAuthenticationEvents
    {
        OnRedirectToLogin = (x =>
        {
            if (x.Request.Path.StartsWithSegments("/api") && x.Response.StatusCode == 200)
                x.Response.StatusCode = 401;

            return Task.CompletedTask;
        }),
        OnRedirectToAccessDenied = (x =>
        {
            if (x.Request.Path.StartsWithSegments("/api") && x.Response.StatusCode == 200)
                x.Response.StatusCode = 403;

            return Task.CompletedTask;
        })
    };
});

проверка сегментов, конечно же, должна быть адаптирована к вашим маршрутам.

person Askar Rayapov    schedule 16.09.2017

Если у вас есть страницы, для которых требуется перенаправление, и другие URL-адреса, которые не должны иметь перенаправления, см. Этот вопрос для решения, которое использует логику перенаправления по умолчанию только для URL-адресов, не относящихся к API:

Запретить перенаправление URL-адресов API в ASP.NET Core

person Edward Brey    schedule 03.02.2017