简易API密钥认证实现

在现代的Web应用程序中,API密钥认证是一种常见的安全机制,用于验证请求者的身份。本文将介绍如何在ASP.NETCore中实现一个简单且易于理解的API密钥认证机制。将通过扩展原生的认证机制来创建自己的验证逻辑,而不需要复杂的MVC或自定义中间件。

简介

ASP.NETCore提供了强大的认证系统,允许开发者通过扩展来实现自定义的认证逻辑。将使用services.AddAuthentication方法来添加一个API密钥认证方案。

开始编码

首先,需要定义一个配置类来存储API密钥认证的相关配置,例如密钥本身和查询字符串键。创建一个名为ApiKeyAuthNOptions.cs的文件,内容如下:

using Microsoft.AspNetCore.Authentication; namespace APIAuthentication.Resource.Infrastructure { public class ApiKeyAuthNOptions : AuthenticationSchemeOptions { public string ApiKey { get; set; } public string QueryStringKey { get; set; } } }

接下来,需要实现一个认证处理器,它将负责验证API密钥并创建认证票据。创建一个名为ApiKeyAuthN.cs的文件,内容如下:

using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Text.Encodings.Web; using System.Threading.Tasks; namespace APIAuthentication.Resource.Infrastructure { public static class ApiKeyAuthNDefaults { public const string SchemaName = "ApiKey"; } public class ApiKeyAuthN : AuthenticationHandler { public ApiKeyAuthN(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { } protected override Task HandleAuthenticateAsync() { throw new System.NotImplementedException(); } } }

HandleAuthenticateAsync方法中,将实现API密钥的验证逻辑。如果提供的密钥与预设的密钥匹配,将创建一个认证票据并返回成功结果;否则,将返回失败结果。

构建主体

需要构建一个主体来表示认证的用户。这可以通过创建一个名为BuildPrincipal的方法来实现,该方法将根据提供的密钥和其他可选声明来构建一个ClaimsPrincipal对象。

static ClaimsPrincipal BuildPrincipal(string schemeName, string name, string issuer, params Claim[] claims) { var identity = new ClaimsIdentity(schemeName); identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, name, ClaimValueTypes.String, issuer)); identity.AddClaim(new Claim(ClaimTypes.Name, name, ClaimValueTypes.String, issuer)); identity.AddClaims(claims); var principal = new ClaimsPrincipal(identity); return principal; }

在这个方法中,可以根据应用程序需求自定义ClaimsIdentity,添加如角色、电话号码、发行者、合作伙伴ID等声明。

整合认证

现在已经拥有了实现认证所需的所有组件,接下来需要在Startup.cs文件中启动认证。添加以下内容:

public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(ApiKeyAuthNDefaults.SchemaName) .AddScheme(ApiKeyAuthNDefaults.SchemaName, opt => { opt.ApiKey = "Hello-World"; opt.QueryStringKey = "key"; opt.ClaimsIssuer = "API-Issuer"; }); services.AddAuthorization(); }

AddScheme中,配置服务使用认证处理器。接下来,设置Configure方法以使用认证和授权中间件。

运行示例

以下是不使用API密钥和使用API密钥时的请求示例:

简化使用

为了简化AddApiKey处理器的使用,可以创建一个扩展方法构建器。创建一个名为ApiKeyAuthNExtensions.cs的文件,内容如下:

using APIAuthentication.Resource.Infrastructure; using System; namespace Microsoft.AspNetCore.Authentication { public static class ApiKeyAuthNExtensions { public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder builder, Action? configureOptions) => AddApiKey(builder, ApiKeyAuthNDefaults.SchemaName, configureOptions); public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder builder, string authenticationScheme, Action? configureOptions) => builder.AddScheme(authenticationScheme, configureOptions); } }

这将添加一个名为AddApiKey扩展方法,而不是调用AddScheme。在Startup类的ConfigureServices方法中使用新方法:

public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(ApiKeyAuthNDefaults.SchemaName) .AddApiKey(opt => { opt.ApiKey = "Hello-World"; opt.QueryStringKey = "key"; }); // new version // .AddScheme(ApiKeyAuthNDefaults.SchemaName, opt => { // opt.ApiKey = "Hello-World"; // opt.QueryStringKey = "key"; // }); //old version services.AddAuthorization(); }

这就是全部内容!希望喜欢。留下评论。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485