С openIdDict мы должны иметь «UseIdentity ()» в Startup.cs?

У нас есть основное веб-приложение asp.net, которое использует OpenIdDict для аутентификации. Я заметил, что мои вызовы Ajax без аутентификации возвращают 200 и нашу форму входа в тело ответа. Из того, что я прочитал, это ожидаемое поведение, поскольку OpenIdDict обрабатывает запрос, затем ядро ​​​​ASP.NET обрабатывает его и возвращает 200. Ядро ASP.NET обрабатывает его, потому что «UseIdentity()» вызывается в Startup.cs. Все примеры, которые я видел для OpenIdDict, вызывают «UseIdentity». У меня есть 2 вопроса.

  1. Если я не хочу, чтобы ядро ​​ASP.NET обрабатывало мой запрос, могу ли я просто удалить «UseIdentity()»? Я попробовал это, и теперь я получаю 401 вместо 200. Есть ли какой-либо вред в этом, или OpenIdDict требует «UseIdentity ()»?
  2. Если я не хочу потерять возможность перенаправления для входа в пользовательский интерфейс, это лучший/самый простой/безопасный способ выполнить это, чтобы переопределить OnRedirectToLogin? Пример кода ниже:

options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents { OnRedirectToLogin = ctx => { if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == (int) HttpStatusCode.OK) { ctx.Response.StatusCode = (int) HttpStatusCode.Unauthorized; } else { ctx.Response.Redirect(ctx.RedirectUri); } return Task.FromResult(0); } };

Источник примера кода: https://devblog.dymel.pl/2016/07/07/return-401-unauthorized-from-asp-net-core-api/

Дальнейшее обсуждение этой проблемы здесь: https://github.com/aspnet/Security/issues/804


person Mike Becatti    schedule 04.04.2017    source источник


Ответы (1)


Требует ли OpenIdDict «UseIdentity()»?

Нет, ПО промежуточного слоя для файлов cookie, зарегистрированное app.UseIdentity(), не используется напрямую OpenIddict, поэтому вызов этого метода не требуется для правильной работы OpenIddict.

Тем не менее, если вы используете функции ASP.NET Core Identity, которые полагаются на аутентификацию с помощью файлов cookie (почти все в AccountController/ManageController), то да, вы должны использовать app.UseIdentity().

Все примеры, которые я видел для OpenIdDict, вызывают «UseIdentity».

Образец, в котором не используется app.UseIdentity(), можно посмотреть на официальный образец потока паролей или прочитайте этой записи в блоге, в которой показано, как использовать OpenIddict без ASP.NET Core Identity.

Если я не хочу потерять возможность перенаправления для входа в пользовательский интерфейс, это лучший/самый простой/безопасный способ выполнить это, чтобы переопределить OnRedirectToLogin?

Это определенно работает, но я лично выбрал более безопасный вариант, заключающийся в использовании ветвления конвейера для исключения промежуточного программного обеспечения файлов cookie, зарегистрированного app.UseIdentity(). Это не только предотвращает перехват Identity ответов 401, возвращаемых вашим API, но также позволяет избежать XSRF-атак, поскольку HttpContext.User нельзя заполнить идентификатором, извлеченным из файла cookie:

app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), branch =>
{
    branch.UseIdentity();
});

См. https://github.com/openiddict/openiddict-samples/blob/master/samples/CodeFlow/AuthorizationServer/Startup.cs#L141-L158 для полного примера.

person Kévin Chalet    schedule 06.04.2017
comment
У вас есть пример проекта или руководство, как сделать то же самое с Core 2.0 и OpenIdDict 2.x? - person Mike Becatti; 12.09.2017
comment
Все примеры OpenIddict были обновлены для версии 2.x: github.com/openiddict/openiddict-samples. К сожалению, выбор промежуточного программного обеспечения для аутентификации на основе пути больше не поддерживается в версии 2.x, поэтому рекомендуется использовать подход [Authorize(AuthenticationSchemes = "Bearer")]. Прочтите github.com/aspnet/Announcements/issues/262 для получения дополнительной информации. - person Kévin Chalet; 12.09.2017