Простая в использовании и очень легкая реализация базовой схемы аутентификации в стиле Microsoft для ASP.NET Core.
Посмотреть на GitHub
.NET Framework 4.6.1 и/или NetStandard 2.0 и более поздние версии
Многоцелевой: net8.0; сеть7.0; сеть6.0; сеть5.0; сетевое приложение3.1; сетевое приложение3.0; нетстандарт2.0; сеть461
Эта библиотека опубликована на NuGet. Таким образом, пакет NuGet можно установить непосредственно в ваш проект, если вы хотите использовать его без внесения каких-либо дополнительных изменений в код.
Загрузите прямо по ссылке ниже. Пожалуйста, рассмотрите возможность загрузки нового пакета, поскольку старый устарел.
Ссылка на новый пакет — AspNetCore.Authentication.Basic.
Ссылка на старый пакет — Mihir.AspNetCore.Authentication.Basic.
Или выполнив приведенную ниже команду в своем проекте.
PM> Install-Package AspNetCore.Authentication.Basic
Образцы доступны в каталоге образцов.
Настроить его довольно просто. Чтобы начать использовать эту библиотеку, вам потребуются базовые рабочие знания ASP.NET Core 2.0 или новее.
Есть два разных способа использования этой библиотеки для выполнения своей работы. При необходимости оба способа можно смешивать.
1] Использование реализации IBasicUserValidationService .
2] Использование BasicOptions.Events (делегат OnValidateCredentials), аналогичный подходу, который вы найдете в библиотеках аутентификации Microsoft.
Примечания:
Требуется, чтобы в параметрах был установлен Realm, если SuppressWWWAuthenticateHeader не установлен.
Если используется реализация интерфейса IBasicUserValidationService, а также установлен делегат BasicOptions.Events.OnValidateCredentials, то этот делегат будет использоваться первым.
Всегда используйте протокол HTTPS (SSL-сертификат) при использовании базовой аутентификации.
с использованием AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection Services){// Требуется, чтобы в параметрах был установлен Realm, если SuppressWWWAuthenticateHeader не установлен.// Если используется реализация интерфейса IBasicUserValidationService, а также параметры Делегат .Events.OnValidateCredentials также установлен, тогда этот делегат будет использоваться. first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// Для приведенного ниже параметра AddBasic без параметра типа потребуется установка делегата options.Events.OnValidateCredentials.//.AddBasic(options => { options.Realm = "My App"; }) ;// Приведенный ниже параметр AddBasic with type добавит BasicUserValidationService в контейнер зависимостей. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddControllers();//// По умолчанию аутентификация не запрашивается для каждого запроса, который по умолчанию предназначен для ASP.NET Core. поведение.//// Поэтому, чтобы бросить вызов аутентификации для каждого запроса, используйте опцию FallbackPolicy ниже.//services.AddAuthorization(options =>//{// options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseHttpsRedirection();// Ниже приведен порядок цепочки конвейера: важно!app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
с использованием AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection Services){// Требуется, чтобы в параметрах был установлен Realm, если SuppressWWWAuthenticateHeader не установлен.// Если используется реализация интерфейса IBasicUserValidationService, а также параметры Делегат .Events.OnValidateCredentials также установлен, тогда этот делегат будет использоваться. first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// Для приведенного ниже параметра AddBasic без параметра типа потребуется установка делегата options.Events.OnValidateCredentials.//.AddBasic(options => { options.Realm = "My App"; }) ;// Приведенный ниже параметр AddBasic with type добавит BasicUserValidationService в контейнер зависимостей. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// По умолчанию аутентификация не запрашивается для каждого запроса, который по умолчанию предназначен для ASP.NET Core. поведение.//// Поэтому, чтобы бросить вызов аутентификации для каждого запроса, используйте опцию ниже вместо вышеуказанных сервисов.AddMvc().//services.AddMvc(options => //{// options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});}public void Configure(приложение IApplicationBuilder, среда IHostingEnvironment){app.UseAuthentication( );app.UseMvc();}}
использование AspNetCore.Authentication.Basic; общедоступный класс BasicUserValidationService: IBasicUserValidationService {частный только для чтения ILogger<BasicUserValidationService> _logger; частный только для чтения IUserRepository _userRepository; public BasicUserValidationService(ILogger<BasicUserValidationService> logger, IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}public async Task<bool> IsValidAsync(строка имени пользователя, строка пароля){try{// ПРИМЕЧАНИЕ. НЕ ИСПОЛЬЗУЙТЕ ЭТУ РЕАЛИЗАЦИЯ. ЭТО ТОЛЬКО ДЛЯ ДЕМО-ЦЕЛЕЙ // Напишите здесь свою реализацию и верните true или false в зависимости от проверки. var user = await _userRepository.GetUserByUsername(username);var isValid = user != null && user.Password == пароль; return isValid;}catch (Исключение e){_logger.LogError(e, e.Message);бросить;}}}
Требуется установить, если для параметра SuppressWWWAuthenticateHeader не установлено значение true. Он используется с заголовком ответа WWW-Authenticate при вызове неаутентифицированных запросов.
Значение по умолчанию — ложь.
Если установлено значение true, он НЕ будет возвращать заголовок ответа WWW-Authenticate при вызове неаутентифицированных запросов.
Если установлено значение false, он будет возвращать заголовок ответа WWW-Authenticate при вызове неаутентифицированных запросов.
Значение по умолчанию — ложь.
Если установлено значение true, он проверяет наличие фильтра AllowAnonymous для действия контроллера или метаданных в конечной точке, и, если он найден, он не пытается аутентифицировать запрос.
Объект, предоставляемый приложением для обработки событий, создаваемых промежуточным программным обеспечением базовой аутентификации.
Приложение может полностью реализовать интерфейс или создать экземпляр BasicEvents и назначить делегатов только тем событиям, которые оно хочет обработать.
Делегат, назначенный этому свойству, будет вызван непосредственно перед проверкой учетных данных.
Для выполнения аутентификации необходимо предоставить делегата для этого свойства.
В вашем делегате вы должны либо вызвать context.ValidationSucceeded(), который будет обрабатывать создание субъекта утверждений аутентификации из сведений о пользователе, которому будет присвоено свойство context.Principal, и вызывать context.Success(), либо создать субъект утверждений аутентификации из пользователя. детали и присвойте их свойству context.Principal и, наконец, вызовите метод context.Success().
Если только свойство context.Principal установлено без вызова метода context.Success(), то автоматически вызывается метод Success().
Делегат, назначенный этому свойству, будет вызван при успешной аутентификации. Он не будет вызываться, если назначен делегат OnValidateCredentials.
Его можно использовать для добавления утверждений, заголовков и т. д. в ответ.
Делегат, назначенный этому свойству, будет вызываться при возникновении любого неожиданного исключения в библиотеке.
Делегат, назначенный этому свойству, будет вызван перед отправкой вызова обратно вызывающему объекту при обработке несанкционированного ответа.
Используйте это только в том случае, если вы знаете, что делаете, и хотите использовать собственную реализацию. Настройте делегата для решения проблем с проблемой 401, если рассматриваемая схема аутентификации обрабатывает взаимодействие аутентификации как часть потока запросов. (например, добавление заголовка ответа или изменение результата 401 на 302 на странице входа или внешнем месте входа.)
Вызовите context.Handled() в конце, чтобы любая логика по умолчанию для этого вызова была пропущена.
Делегат, назначенный этому свойству, будет вызван, если авторизация завершится неудачей и приведет к ответу «Запрещено».
Используйте это только в том случае, если вы знаете, что делаете, и хотите использовать собственную реализацию.
Настройте делегата на обработку запрета.
Вызовите context.Handled() в конце, чтобы любая логика по умолчанию была пропущена.
В ASP.NET Core все запросы на проверку подлинности по умолчанию не запрашиваются. Так что не волнуйтесь, если ваш BasicUserValidationService не будет задействован, если вы не передадите необходимые базовые данные аутентификации с запросом. Это нормальное поведение. ASP.NET Core проверяет аутентификацию только тогда, когда ему специально указано это сделать, либо путем украшения контроллера/метода атрибутом фильтра [Authorize] , либо каким-либо другим способом.
Однако, если вы хотите, чтобы все запросы подвергали аутентификации по умолчанию, в зависимости от того, что вы используете, вы можете добавить приведенную ниже строку параметров в метод ConfigurationServices класса Startup .
// В ASP.NET Core 3.0 onwardsservices.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// ИЛИ// В ASP.NET Core 2.0 onwardsservices.AddMvc (options => {options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
Если вы не используете MVC, но используете конечные точки в ASP.NET Core 3.0 или более поздней версии, вы можете добавить метод цепочки .RequireAuthorization()
к карте конечных точек в разделе «Настроить метод в классе запуска» , как показано ниже.
// ASP.NET Core 3.0 и далееapp.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");}).RequireAuthorization(); / / ЗАМЕТЬТЕ ЭТО ЗДЕСЬ });
ASP.NET Core поддерживает добавление нескольких схем аутентификации, которые также поддерживает эта библиотека. Просто нужно использовать метод расширения, который принимает имя схемы в качестве параметра. В остальном все то же самое. Этого можно достичь разными способами. Ниже приведен лишь краткий грубый пример.
Обратите внимание, что параметр имени схемы может представлять собой любую строку по вашему желанию.
public void ConfigureServices(IServiceCollection Services){services.AddTransient<IUserRepository, InMemoryUserRepository>();services.AddAuthentication("Scheme1").AddBasic<BasicUserValidationService>("Scheme1", options => { options.Realm = "My App"; }).AddBasic<BasicUserValidationService_2>("Scheme2", options => { options.Realm = "My App"; }).AddBasic("Scheme3", options => { options.Realm = "Мое приложение"; options.Events = new BasicEvents {OnValidateCredentials = async (context) => {var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var user = await userRepository.GetUserByUsername(context.Username);var isValid = user ! = ноль && user.Password == context.Password;if (isValid){context.Response.Headers.Add("ValidationCustomHeader", "From OnValidateCredentials");varclaims = new[]{new Claim("CustomClaimType", "Пользовательское значение утверждения" - из OnValidateCredentials")};context.ValidationSucceeded(claims); // утверждения необязательны}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Схема3").RequireAuthenticatedUser().Build();});}
Версия | Примечания |
---|---|
8.0.0 |
|
7.0.0 |
|
6.0.1 |
|
5.1.0 |
|
5.0.0 |
|
3.1.1 |
|
3.1.0 |
|
2.2.0 |
|
RFC 7617: Техническая спецификация HTTP Basic.
Документация по безопасности ASP.NET Core
aspnet/безопасность
Лицензия MIT