You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:05:06