Измените атрибут авторизации, чтобы вернуть 401 — .net core 3.1

#asp.net-core #.net-core #asp.net-core-3.1

#asp.net-core #.net-core #asp.net-core-3.1

Вопрос:

Я хочу защитить свои контроллеры атрибутом авторизации. А затем просто создайте глобальный перехватчик axios, который реагирует на 401-е

Кажется, что атрибут авторизации возвращает 302 в / account / login по умолчанию. Как я могу переопределить это?

Код: Startup.cs / ConfigureServices

 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();
  

Startup.cs / Configure

 app.UseAuthorization();
app.UseAuthentication();
  

main.ts

 axios.interceptors.response.use(undefined, function (error) {
    if (error.response.status === 401) {
       // I'll do something here
       return Promise.reject(error);
    }
});
  

Комментарии:

1. В методе configure app.useauthorization и app.useauthentication должны быть взаимозаменяемыми. Аутентификация предшествует авторизации.

2. по умолчанию используется возврат 401, в вашей конфигурации что-то не так, как упоминалось выше, важен порядок вашего метода настройки

3. Я изменил порядок, но я все еще получаю 302. Спасибо

4. Я запустил совершенно новый веб-сайт .net Core с VS 2019 и добавил только 3 строки в startup.cs и добавил [Авторизовать] в WeatherForecastController. Переход к /weatherforecast по-прежнему перенаправляет /account / login

Ответ №1:

Вы могли бы изменить свой services.AddCookie , как показано ниже:

 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            options.Events.OnRedirectToLogin = context =>
            {
                context.Response.StatusCode = 401;
                return Task.CompletedTask;
            };
        });
  

Убедитесь, что ваш порядок промежуточного программного обеспечения такой, как показано ниже:

 app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});