易于使用且非常轻量级的 Microsoft 风格的 ASP.NET Core 基本方案身份验证实现。
在 GitHub 上查看
.NET Framework 4.6.1 和/或 NetStandard 2.0 及以上版本
多目标:net8.0; NET7.0; NET6.0; NET5.0; netcoreapp3.1; netcoreapp3.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的身份验证库中找到的方法相同
笔记:
如果未设置 SuppressWWWAuthenticateHeader,则需要在选项中设置 Realm。
如果使用 IBasicUserValidationService 接口的实现并且还设置了 BasicOptions.Events.OnValidateCredentials 委托,则将首先使用此委托。
使用基本身份验证时,请始终在生产中使用 HTTPS(SSL 证书)协议。
using AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// 如果未设置 SuppressWWWWAuthenticateHeader,则需要在选项中设置 Realm。// 如果使用 IBasicUserValidationService 接口的实现以及选项.Events.OnValidateCredentials 委托也已设置,然后将使用此委托first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)//下面不带类型参数的AddBasic需要设置options.Events.OnValidateCredentials委托。//.AddBasic(options => { options.Realm = "My App"; }) ;// 下面带有类型参数的 AddBasic 会将 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.MapControllers();});}}
using AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// 如果未设置 SuppressWWWWAuthenticateHeader,则需要在选项中设置 Realm。// 如果使用 IBasicUserValidationService 接口的实现以及选项.Events.OnValidateCredentials 委托也已设置,然后将使用此委托first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)//下面不带类型参数的AddBasic需要设置options.Events.OnValidateCredentials委托。//.AddBasic(options => { options.Realm = "My App"; }) ;// 下面带有类型参数的 AddBasic 会将 BasicUserValidationService 添加到依赖容器中。 .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// 默认情况下,不会对每个请求进行身份验证,这是 ASP.NET Core 的默认意图行为。//// 因此,要对每个请求进行身份验证,请使用下面的选项而不是上面的 services.AddMvc().//services.AddMvc(options => //{// options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseAuthentication();app.UseMvc ();}}
使用 AspNetCore.Authentication.Basic;公共类 BasicUserValidationService : IBasicUserValidationService{私有只读 ILogger<BasicUserValidationService> _logger;私有只读 IUserRepository _userRepository;公共 BasicUserValidationService(ILogger<BasicUserValidationService> 记录器, IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}public async Task<bool> IsValidAsync(字符串用户名,字符串密码){try{// 注意:请勿使用此实现。这仅用于演示目的// 在此处编写您的实现并根据验证返回 true 或 false..var user = wait _userRepository.GetUserByUsername(username);var isValid = user != null && user.Password == password;return isValid;}catch(异常e){_logger.LogError(e,e.Message);抛出;}}}
如果 SuppressWWWAuthenticateHeader 未设置为 true,则需要设置。当质疑未经身份验证的请求时,它与 WWW-Authenticate 响应标头一起使用。
默认值为 false。
如果设置为 true,则在挑战未经身份验证的请求时不会返回 WWW-Authenticate 响应标头。
如果设置为 false,则在挑战未经身份验证的请求时将返回 WWW-Authenticate 响应标头。
默认值为 false。
如果设置为 true,它会检查是否允许匿名过滤端点上的控制器操作或元数据,如果找到,它不会尝试对请求进行身份验证。
应用程序提供的对象,用于处理基本身份验证中间件引发的事件。
应用程序可以完全实现该接口,也可以创建 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未命中,请不要担心。这是正常行为。仅当通过使用[Authorize]过滤器属性装饰控制器/方法或通过其他方式明确告知 ASP.NET Core 进行身份验证时,ASP.NET Core 才会发起身份验证挑战。
但是,如果您希望默认情况下所有请求都进行质询身份验证,则根据您所使用的内容,您可以将以下选项行添加到Startup类的ConfigureServices方法中。
// 在 ASP.NET Core 3.0 上services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// 或// 在 ASP.NET Core 2.0 上services.AddMvc (选项=> {options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
如果您不使用 MVC,而是在 ASP.NET Core 3.0 或更高版本上使用 Endpoints,则可以将链方法.RequireAuthorization()
添加到Startup类上的Configure方法下的端点映射,如下所示。
// ASP.NET Core 3.0 及以上app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");}).RequireAuthorization(); / / 注意这里!!!!
ASP.NET Core 支持添加多个身份验证方案,该库也支持。只需使用以方案名称作为参数的扩展方法即可。其余的都一样。这可以通过许多不同的方式来实现。下面只是一个简单的示例。
请注意,方案名称参数可以是您想要的任何字符串。
公共无效ConfigureServices(IServiceCollection服务){services.AddTransient <IUserRepository,InMemoryUserRepository>();services.AddAuthentication(“Scheme1”).AddBasic <BasicUserValidationService>(“Scheme1”,选项=> { options.Realm =“我的应用程序”; }).AddBasic<BasicUserValidationService_2>("方案2",选项=> { options.Realm = "我的应用程序" }).AddBasic("Scheme3", options => { options.Realm = "我的应用程序"; options.Events = new BasicEvents{OnValidateCredentials = async (context) =>{var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var user = wait userRepository.GetUserByUsername(context.Username);var isValid = user ! = null && user.Password == context.Password;if (isValid){context.Response.Headers.Add("ValidationCustomHeader", "From OnValidateCredentials");var Claims = new[]{new Claim("CustomClaimType", "自定义声明值 - 来自 OnValidateCredentials")};context.ValidationSucceeded (索赔); // 声明是可选的}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Scheme3").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/安全
麻省理工学院许可证