Openiddict возвращает 404 вместо 401 для неавторизованных вызовов веб-API (ядро 2.0)

Я установил openiddict в веб-api .net core 2.0, и у меня работают потоки кода и паролей. У меня есть тестовые примеры, чтобы гарантировать, что заблокированным действиям в API будет отказано, когда запрашивающая сторона не авторизована, которая ищет код состояния 401.

Когда эти тесты запускаются, ответ 404 not found вместо 401, что делает мой тест неуспешным. Я знаю, что маршрут правильный, потому что он возвращает 200, когда разрешает анонимность. Я получаю 404 всякий раз, когда пытаюсь получить доступ к любому действию, заблокированному без аутентификации. Является ли это статусом по умолчанию для openiddict, когда вы пытаетесь получить доступ к ресурсу без аутентификации? Это происходит независимо от того, запускается ли он из браузера, почтальона или из тестового примера. Как мне настроить его для возврата 401? Я представил свою конфигурацию ниже.

services.AddOpenIddict<int>(options =>
{
    options.AddEntityFrameworkCoreStores<ApplicationContext>();
    options.AddMvcBinders();
    options.EnableAuthorizationEndpoint("/connect/authorize");
    options.EnableTokenEndpoint("/connect/token");
    options.AllowAuthorizationCodeFlow();
    options.AllowPasswordFlow();
    options.AllowRefreshTokenFlow();
    options.RequireClientIdentification();
    options.SetAccessTokenLifetime(TimeSpan.FromMinutes(1));
    options.SetRefreshTokenLifetime(TimeSpan.FromMinutes(20160));
    options.DisableHttpsRequirement();
 });
services.AddAuthentication()
    .AddFacebook(o => { o.ClientId = settings.FacebookAppID; o.ClientSecret = settings.FacebookAppSecret; })
    .AddOAuthValidation();

person Geekn    schedule 25.10.2017    source источник


Ответы (1)


Мне удалось получить желаемый 401, указав вызов по умолчанию для oauth. Было бы неплохо узнать, куда он пытается перенаправить.

services.AddAuthentication(o =>
    {
        o.DefaultAuthenticateScheme = OAuthValidationDefaults.AuthenticationScheme;
        o.DefaultChallengeScheme = OAuthValidationDefaults.AuthenticationScheme;
    })
    .AddFacebook(o => { o.ClientId = settings.FacebookAppID; o.ClientSecret = settings.FacebookAppSecret; })
    .AddOAuthValidation();
person Geekn    schedule 25.10.2017
comment
Would still be nice to know where it was trying to redirect to. - ›к странице отказа в доступе, заданной в параметрах удостоверения ASP.NET Core. Поведение, которое вы видите, вызвано обработчиками файлов cookie, используемыми Identity, которые настроены как схемы по умолчанию, и которые перенаправляют вас, а не возвращают ответ 403. Поскольку в вашем приложении нет страницы с отказом в доступе, вы в конечном итоге получите ответ 404. - person Kévin Chalet; 25.10.2017
comment
(на случай, если мой предыдущий комментарий был непонятен: на самом деле это не имеет ничего общего с самим OpenIddict). - person Kévin Chalet; 25.10.2017
comment
В этом есть смысл. Очень признателен за то, что вы это сделали. Я новичок в openiddict, поэтому я не знал, был ли там какой-то встроенный механизм или что-то в этом роде. Кстати ... здорово, что вы следите за этими форумами ... вы мне несколько раз помогали ... ура! - person Geekn; 26.10.2017
comment
Поэтому, когда я изменил задачу по умолчанию на OAuth, теперь в моих тестах я получил ожидаемое значение 401. Интересно, что внешний вход в систему перестал работать, потому что метод Exchange () гарантирует, что пользователь вошел в систему перед выдачей токена. Поскольку по умолчанию файл cookie больше не используется, пользователь не входит в систему автоматически из внешнего файла cookie входа, поэтому он не работает. Является ли здесь единственным вариантом, позволяющим использовать файлы cookie в качестве схемы по умолчанию и явно указывать схему OAuth в моем атрибуте авторизации в контроллерах? Или есть способ отключить поведение перенаправления файлов cookie обратно для входа в систему? - person Geekn; 28.10.2017
comment
На самом деле еще лучше, возможно, лучшим решением является переопределение события OnRedirectToLogin в настройках cookie по умолчанию, чтобы вернуть 401. - person Geekn; 28.10.2017
comment
Вы можете попробовать это: stackoverflow.com/questions/46464469/ - person Kévin Chalet; 28.10.2017
comment
Эта ссылка для создания пользовательской схемы аутентификации работает отлично. - person Geekn; 29.10.2017