8

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

Я пробовал то, что упоминается here (эта же проблема, используя старую бета-версию, я использую 1.0.0-rc1-final). У меня нет пространства имен Уведомления (было удалено в 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 вместо этого. Что это за трюк?

+0

Вы пытаетесь сделать это на странице входа? или это для проверки подлинности API REST? Если это для API, вы можете посмотреть на это: http://wildermuth.com/2015/9/10/ASP_NET_5_Identity_and_REST_APIs – drinck

+0

REST API, ваша ссылка предполагает, что пространство имен существует, но оно было удалено. Связанное решение больше не работает. – galmok

ответ

9

решение не настраивать 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); 
       } 
      }; 
     }); 
+5

Просто использование 'o.Cookies.ApplicationCookie.AutomaticChallenge = false;' было достаточно для меня (я никогда не хотел перенаправления). –

+0

@ PeppeL-G Это единственное, на что я мог бы работать. Спасибо. –

8

Взято отсюда (Shawn Wildermuth -> ASP.NET 5 Идентичность и REST API-интерфейсы -> Комментарий «Мехди Ханафи») и протестировали API с Почтальон

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); 
     } 
    } 
}; 
+0

Как вы его перенаправляете в первую очередь. Я хочу, чтобы Бог мог заставить меня перенаправить. Он этого не сделает. – Sam

2

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

Suppress redirect on API URLs in ASP.NET Core

1

из Идентичность 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; 
     }) 
    }; 
}); 

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