.NET 5 API如何同时启用NTLM与SSL加密的Basic Authentication?
.NET 5 API 同时支持NTLM与SSL加密Basic Authentication实现方案
1. 注册两种身份认证方案
在项目的Program.cs(或Startup.cs)中,同时注册NTLM(通过Negotiate认证)和Basic Authentication服务,并为每种方案指定唯一标识:
// 注册认证服务 builder.Services.AddAuthentication(options => { // 可根据业务调整默认认证方案,此处设为NTLM options.DefaultAuthenticateScheme = "Negotiate"; options.DefaultChallengeScheme = "Negotiate"; }) // 添加NTLM认证(.NET 5中通过Negotiate组件实现) .AddNegotiate(options => { // 按需配置NTLM参数,比如设置 impersonation 级别 options.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; }) // 添加Basic Authentication,指定Scheme名称为"Basic" .AddBasic("Basic", options => { // 强制要求SSL加密传输 options.RequireSsl = true; // 自定义用户验证逻辑 options.Events = new BasicAuthenticationEvents { OnValidateCredentials = async context => { // 替换为实际的用户校验逻辑,比如从数据库验证用户名密码 var isValid = await ValidateUserCredentials(context.UserName, context.Password); if (isValid) { var claims = new List<Claim> { new Claim(ClaimTypes.Name, context.UserName) }; context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name)); context.Success(); } } }; });
2. 配置授权策略允许双认证方式
定义授权策略,允许用户通过任意一种认证方案访问API:
builder.Services.AddAuthorization(options => { options.AddPolicy("AllowEitherAuth", policy => { policy.RequireAuthenticatedUser(); // 指定允许的两种认证Scheme policy.AddAuthenticationSchemes("Negotiate", "Basic"); }); });
3. 为不同客户端分配认证规则
根据业务场景,可通过两种方式区分认证方式:
- 按控制器/接口区分:Web UI对应的控制器标记
[Authorize(AuthenticationSchemes = "Negotiate")],BizTalk对应的控制器标记[Authorize(AuthenticationSchemes = "Basic")] - 按路径区分:为BizTalk专属路径单独指定Basic认证:
app.UseAuthorization(); // 全局应用默认授权策略 app.MapControllers().RequireAuthorization("AllowEitherAuth"); // 为BizTalk专属接口单独配置Basic认证 app.MapControllerRoute( name: "biztalk-api", pattern: "api/biztalk/{action}", defaults: new { controller = "BizTalk" }) .RequireAuthorization(policy => policy.AddAuthenticationSchemes("Basic"));
4. 强制SSL加密保障Basic Auth安全
在Program.cs中启用HTTPS强制跳转和HSTS,确保所有请求通过SSL传输:
// 强制HTTP请求跳转至HTTPS app.UseHttpsRedirection(); // 启用HSTS增强SSL安全性 app.UseHsts();
注意事项
- NTLM认证依赖部署环境的Windows身份验证配置,如IIS需启用Windows身份验证
- Basic Auth必须配合SSL使用,禁止在HTTP环境下部署
- 用户验证逻辑需遵循安全规范,避免硬编码或弱校验逻辑
内容的提问来源于stack exchange,提问作者Pablo Alejandro Incinga
相关产品推荐
相关产品推荐

