在现代的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();
}
这就是全部内容!希望喜欢。留下评论。