В dotnet core 1.1 asp я смог настроить и использовать промежуточное программное обеспечение идентификации, а затем промежуточное программное обеспечение jwt, выполнив следующие действия:
app.UseIdentity();
app.UseJwtBearerAuthentication(new JwtBearerOptions() {});
Теперь это изменилось в том, что мы реализуем промежуточное программное обеспечение с помощью
app.UseAuthentication();
Конфигурация настроек выполняется через раздел ConfigureServices Startup.cs.
В документации по миграции есть ссылки на использование схемы авторизации:
В 2.0 проектах аутентификация настраивается через службы. каждый схема аутентификации зарегистрирована в методе ConfigureServices Startup.cs. Метод UseIdentity заменяется на UseAuthentication.
Кроме того, имеется ссылка на:
Настройка схем аутентификации по умолчанию
В 1.x свойства AutomaticAuthenticate и AutomaticChallenge должны были быть установлены на единой схеме аутентификации. Там было нет хорошего способа обеспечить это.
В 2.0 эти два свойства были удалены как флаги на отдельном экземпляре AuthenticationOptions и перешли в базовый класс AuthenticationOptions. Свойства могут быть сконфигурированы в вызове метода AddAuthentication в пределах Метод ConfigureServices для Startup.cs:
В качестве альтернативы используйте перегруженную версию AddAuthentication метод для установки более одного свойства. В следующей перегруженной метод, схема по умолчанию установлена на CookieAuthenticationDefaults.AuthenticationScheme. Аутентификация схема может альтернативно быть указана в пределах вашей индивидуальной [Авторизовать] атрибуты или политики авторизации.
Возможно ли, что в dotnet core 2.0 можно использовать несколько схем аутентификации? Я не могу заставить политику уважать конфигурацию JWT (схема "Bearer" ), и только Identity работает в настоящее время с настройками. Я не могу найти образцы нескольких схем проверки подлинности.
Edit:
Я перечитал документацию и теперь понимаю, что:
app.UseAuthentication()
добавляет автоматическую аутентификацию по схеме по умолчанию. Identity настраивает схемы по умолчанию для вас.
У меня возникла проблема с тем, что похоже на взлом, работающий против нового api, выполнив следующее в Startup.cs Configure:
app.UseAuthentication();
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated)
{
var result = await context.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme);
if (result?.Principal != null)
{
context.User = result.Principal;
}
}
await next.Invoke();
});
Это правильный способ сделать это, или я должен использовать инфраструктуру, DI и интерфейсы для пользовательских реализаций IAuthenticationSchemeProvider?
Изменить - дальнейшие подробности реализации и где ее найти.
JWT Config можно найти здесь, и я использую политики для определения авторизации, включая принятую схему аутентификации:
https://github.com/Arragro/ArragroCMS/blob/master/src/ArragroCMS.Management/Startup.cs
Пользовательское промежуточное ПО все еще реализовано. Контроллер Auth находится здесь:
Он использует API-ключи, созданные приложением, для доступа к данным только для чтения. Вы можете найти реализацию контроллера, использующего политику здесь:
Измените строку подключения DB, чтобы указать на ваш SQL Server, и запустите приложение. Он автоматически переносит БД и настраивает пользователя admin ([email protected] - ArragroPassword1!). Затем перейдите на вкладку "Настройки" в строке меню и нажмите "Настроить параметры ключа API JWT ReadOnly", чтобы получить ключ. В почтальоне получите токен jwt, настроив новую вкладку и установив ее в POST со следующим адресом:
http://localhost:5000/api/auth/readonly-token
Поставка заголовков: Content-Type: application/json
Поставка тела:
{
"apiKey": "the api token from the previous step"
}
Скопируйте токен в ответе, а затем используйте postman:
http://localhost:5000/api/sitemap/flat
Authorization: "bearer - The token you received in the previous request"
Он будет работать вначале из-за пользовательского промежуточного программного обеспечения. Прокомментируйте приведенный выше код и повторите попытку, и вы получите 401.
Изменить - @DonnyTian ответ ниже охватывает мое решение в его комментариях. Проблема, с которой я столкнулась, заключалась в установке политики по умолчанию на UseMvc, но не в предоставлении схемы:
services.AddMvc(config =>
{
var defaultPolicy = new AuthorizationPolicyBuilder(new[] { JwtBearerDefaults.AuthenticationScheme, IdentityConstants.ApplicationScheme })
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(defaultPolicy));
config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
config.Filters.Add(new ValidateModelAttribute());
});
Следуя советам, это работает без специального промежуточного программного обеспечения.