Я пытаюсь понять, как работает пакет Microsoft Identity для аутентификации пользователей.
Мне непонятно, что такое схемы и обработчики и как они используются друг с другом.
Я столкнулся с этими двумя терминами, когда учился использовать пакет Microsoft Identity для аутентификации пользователей. Я пытался найти ответ на этот вопрос сам, но он до сих пор не ясен, поэтому я попытался просмотреть руководства по аутентификации пользователей без этого пакета, чтобы получить более четкое представление о том, что этот пакет делает за кулисами.
Есть некоторые моменты, которые для меня пока неясны:
string authenticationType
передается конструктору ClaimsIdentity(IEnumerable<Claim>? claims, string? authenticationType)
и связано ли это со схемами и обработчиками или нет?SignInManager.PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure)
, предоставляемого пакетом удостоверений?«Какая схема используется при входе пользователя с помощью SignInManager.PasswordSignInAsync
» — это зависит от того, как вы ее настроили, поэтому нам нужно увидеть ваш код Startup
или Program
(т. е. ваши методы ConfigureServices
и Configure
— или их эквиваленты), чтобы дать вам ответ.
Что такое схемы и обработчики и как они связаны?
Схема аутентификации — это особый способ аутентификации клиента или запроса.
Обработчик аутентификации — это class
или функция промежуточного программного обеспечения, которую ASP.NET Core использует для выполнения процесса аутентификации по запросу.
В контексте ASP.NET Core 3.1 или более поздней версии наиболее распространенными схемами аутентификации, с которыми вы столкнетесь, являются:
Microsoft.AspNetCore.Authentication.Cookies
(имя по умолчанию: "Cookies"
)Microsoft.AspNetCore.Authentication.OAuth
(без имени по умолчанию; часто подразумевает использование JWT для доступа к другим ресурсам, а также использование файлов cookie для хранения этих токенов JWT и другой информации аутентификации для пользователей веб-браузера)Microsoft.AspNetCore.Authentication.OpenIdConnect
(как и в случае с OAuth2, ASP.NET Core объединит эту схему с файлами cookie, чтобы пользователи веб-браузера могли использовать аутентификацию без сохранения состояния)Microsoft.AspNetCore.Authentication.JwtBearer
— используйте эту схему, если ваш код ASP.NET Core является веб-сервисом («веб-API») — он не подходит для использования в веб-приложениях MVC с пользователями веб-браузера и если вы не используете OAuth2. или ОИДК. Не используйте эту схему напрямую, если вы используете OAuth2/OIDC, даже если они используют JWT, потому что библиотеки этих других схем берут на себя множество обязанностей, которые вам придется писать здесь вручную (например, криптографические ключи для JWT-проверка).Что такое параметр (
string authenticationType
, передаваемый конструкторуClaimsIdentity(IEnumerable<Claim>? claims, string? authenticationType)
, и связан ли он со схемами и обработчиками или нет?
Если вы не используете ASP.NET Core Identity, вам не о чем беспокоиться, поскольку он больше нигде не используется; и текущая документация (.NET 8) содержит ссылки только на схемы старой школы, такие как HTTP Basic, NTLM, Kerberos и Passport.
"Passport" was Microsoft's first-attempt at their own first-party semi-federated SSO thing around 1999 - it was killed-off sometime around 2003-ish, which was after ASP.NET first launched, which is why ASP.NET (for .NET Framework) has vestigial references to it still. Passport's successor was launched around 2005 as "Windows Live ID" which eventually turned into today's "Microsoft Account" around 2011-ish?
Но если вы используете ASP.NET Core Identity и используете несколько схем аутентификации, то SignInManager
(и в некоторых других местах) используйте это свойство, чтобы проверить, аутентифицирован ли текущий пользователь запроса с помощью определенного SignInManager
с помощью значение свойства SignInManager.AuthenticationScheme
, которое вы настраиваете во время запуска).
Какая схема используется при входе пользователя с помощью
SignInManager.PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure)
, предоставляемого пакетом удостоверений?
Согласно исходному коду, если вы используете MapIdentityApi
с ASP.NET Core Identity, то для SignInManager.AuthenticationScheme
будет установлено значение "Identity.Application"
или "Identity.Bearer"
(в зависимости от того, настроено ли ASP.NET Core Identity для файлов cookie или токенов на предъявителя соответственно) .
Если вы не используете MapIdentityApi
, а используете метод AddDefaultIdentity
ASP.NET Core Identity, тогда используется "Identity.External"
для DefaultSignInScheme
и «Identity.Application» для собственной схемы файлов cookie.
Это проясняет ситуацию, но есть еще кое-что, о чем я хочу узнать в аутентификации на основе файлов cookie. Пользователю предоставляется токен внутри файла cookie, и этот токен используется для аутентификации этого пользователя в каждом последующем запросе. Как это сделать без привязки токена к пользователю в базе данных?
@HossamZaki Токен криптографически подписан IdP: промежуточное программное обеспечение аутентификации вашего приложения проверит подпись с помощью открытого ключа, опубликованного IdP. RP (то есть вашему приложению) не нужна никакая «база данных». Все это построено на доверии: RP доверяет IdP, чтобы знать, кто его пользователи.
спасибо, что прояснили, ценю помощь.
В ядре asp.net Схема — это именованная конфигурация, определяющая способ аутентификации приложения. Также можно понимать, что схема аутентификации — это имя обработчика, а также возможность настройки конкретного экземпляра обработчика. . Схемы аутентификации связаны с соответствующими обработчиками, которые отвечают за фактическое выполнение логики аутентификации. Например, вы можете настроить схему аутентификации с помощью файлов cookie и схему аутентификации JWT.
Обработчики — это типы, которые реализуют поведение схемы и в основном отвечают за аутентификацию пользователей. Каждый обработчик связан с определенной схемой аутентификации и отвечает за обработку запросов аутентификации для этой схемы. Например, обработчик файлов cookie обрабатывает аутентификацию на основе файлов cookie, а обработчик JWT — аутентификацию на основе JWT.
В ClaimsIdentity(IEnumerable<Claim>?claims, string?authenticationType)инициализирует новый экземпляр класса ClaimsIdentity
, используя указанные утверждения и тип аутентификации, где строка аутентификацииType указывает используемый тип аутентификации.
SigninManager
используется для предоставления API для входа пользователя, который содержит схему аутентификации, используемую для входа в систему, а по умолчанию используется ApplicationScheme, который используется для идентификации файлов cookie аутентификации приложения, PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure)
является одним из методов API. Он указывает на попытки входа в указанную комбинацию имени пользователя и пароля как асинхронную операцию. Поэтому при использовании метода SignInManager.PasswordSignInAsync
схема идентификации ASP.NET Core по умолчанию является схемой аутентификации на основе файлов cookie.
Параметр
Claim
authenticationType
на самом деле больше не используется — я думаю, что он был актуален только во времена .NET Framework 2.x-4.x, если вы использовали WS-Security или Windows Identity Foundation. Я когда-либо видел, чтобы свойство было пустым или содержало какое-то короткое значение-заглушку при использовании библиотеки OIDC ASP.NET Core.