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

.NET Core 2 Web API整合Azure AD与本地用户数据库方案问询

在.NET Core 2 Web API中同时支持多Azure AD租户与本地用户认证

我刚好折腾过一模一样的场景,给你梳理下具体怎么实现,分步骤来:

1. 注册两种独立的认证方案

首先要在Startup.cs的ConfigureServices方法里,分别配置Azure AD多租户的JWT认证和你的本地用户自定义令牌认证,给它们各自指定唯一的Scheme名称,这样系统能区分开两种认证方式。

配置多租户Azure AD认证

多租户场景下,Authority要设为common端点,同时要注意验证Issuer(因为来自不同租户的令牌Issuer不一样):

services.AddAuthentication()
    .AddJwtBearer("AzureADBearer", options =>
    {
        options.Authority = "https://login.microsoftonline.com/common/v2.0";
        options.Audience = "你的API应用注册ID"; // 替换成你Azure AD里的API ID
        
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            // 如果你不想硬编码租户ID,可以用动态验证逻辑
            IssuerValidator = (issuer, token, parameters) =>
            {
                // 验证Issuer是否是合法的Azure AD租户端点
                if (issuer.StartsWith("https://login.microsoftonline.com/") && issuer.EndsWith("/v2.0"))
                {
                    return issuer;
                }
                throw new SecurityTokenInvalidIssuerException("无效的租户Issuer");
            },
            ValidateAudience = true,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.FromMinutes(5) // 允许的时间偏差
        };
    })

配置本地用户自定义令牌认证

这里直接复用你已经实现的自定义令牌逻辑,只需要把它注册为另一个JWT Bearer Scheme,确保验证参数和你生成令牌的逻辑一致(比如签名密钥、Issuer、Audience):

// 接上上面的代码,继续添加本地用户认证
.AddJwtBearer("LocalJwtBearer", options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "你的本地令牌颁发者名称", // 比如"https://your-api.com/local-auth"
        ValidateAudience = true,
        ValidAudience = "你的API受众",
        ValidateLifetime = true,
        // 替换成你生成令牌时用的签名密钥
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-strong-signing-key-here"))
    };
});

2. 配置授权策略,允许两种认证方式

接下来要创建一个授权策略,让API接受通过任意一种认证Scheme验证的用户。同样在ConfigureServices里添加:

services.AddAuthorization(options =>
{
    options.AddPolicy("AllowBothAuthTypes", policy =>
    {
        // 添加两种认证Scheme到策略中
        policy.AuthenticationSchemes.Add("AzureADBearer");
        policy.AuthenticationSchemes.Add("LocalJwtBearer");
        // 要求用户必须通过认证
        policy.RequireAuthenticatedUser();
    });
});

3. 启用认证中间件并应用策略

在Configure方法里,确保把UseAuthentication放在UseMvc之前,这样认证逻辑会先处理请求:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // ...其他中间件(比如异常处理、静态文件等)
    app.UseAuthentication(); // 必须在UseMvc之前
    app.UseMvc();
}

然后在你的Controller或者Action上,应用这个策略即可:

[Authorize(Policy = "AllowBothAuthTypes")]
[Route("api/[controller]")]
public class YourController : ControllerBase
{
    // 这里的API方法会接受Azure AD用户和本地用户的请求
    [HttpGet]
    public IActionResult Get()
    {
        // 可以通过User.Identity.Name等获取用户信息
        return Ok($"当前用户: {User.Identity.Name}");
    }
}

额外场景:单独限制某类用户访问

如果有些API只想让Azure AD用户访问,或者只允许本地用户访问,直接指定对应的Scheme即可:

// 只允许Azure AD用户访问
[Authorize(AuthenticationSchemes = "AzureADBearer")]
[HttpGet("azure-only")]
public IActionResult AzureADOnly()
{
    return Ok("只有Azure AD租户用户能看到这个内容");
}

// 只允许本地用户访问
[Authorize(AuthenticationSchemes = "LocalJwtBearer")]
[HttpGet("local-only")]
public IActionResult LocalUserOnly()
{
    return Ok("只有本地数据库用户能看到这个内容");
}

一些注意事项

  • 确保你的自定义令牌生成逻辑和验证参数完全匹配,比如签名算法(默认是HS256)、密钥长度要足够安全(至少256位)。
  • 多租户场景下,如果需要限制特定租户,可以把租户ID加入到ValidIssuers列表里,而不是用动态验证。
  • 可以通过User.Identity.AuthenticationType来判断用户是通过哪种认证方式登录的,方便后续业务逻辑处理。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:05:51