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

现有ASP.NET MVC Web API项目:如何用中间件验证Azure AD B2C令牌并读取声明

在ASP.NET MVC Web API(Owin)中集成Azure AD B2C JWT认证并读取声明

我来帮你搞定这个Azure AD B2C的JWT认证集成问题,之前用UseJwtBearerAuthentication没成功大概率是配置细节没到位,咱们一步步来:


1. 先装必要的NuGet包

Owin的JWT认证依赖几个核心包,打开NuGet包管理器安装以下内容:

  • Microsoft.Owin.Security.Jwt
  • System.IdentityModel.Tokens.Jwt
  • Microsoft.Owin.Host.SystemWeb(如果项目还没装,确保Owin宿主正常运行)

2. 准备Azure AD B2C配置参数

你需要从Azure门户提前获取这些关键值:

  • 租户域名:比如yourtenant.onmicrosoft.com
  • 用户流/策略名称:比如B2C_1_signup_signin(你创建的登录注册策略)
  • 客户端ID:在B2C中注册的应用的客户端ID
  • 元数据地址:格式为https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/v2.0/.well-known/openid-configuration,把占位符替换成你的实际值

3. 修改Startup.cs配置认证中间件

替换你原来的Configuration方法,加入正确的JWT认证配置:

public void Configuration(IAppBuilder app)
{
    // 初始化Web API配置
    var config = new HttpConfiguration();
    WebApiConfig.Configure(config);

    // 填入你的B2C参数
    var b2cTenant = "yourtenant.onmicrosoft.com";
    var policyName = "B2C_1_signup_signin";
    var clientId = "your-client-id-here";
    var metadataAddress = $"https://{b2cTenant}.b2clogin.com/{b2cTenant}.onmicrosoft.com/{policyName}/v2.0/.well-known/openid-configuration";

    // 配置JWT认证中间件
    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
    {
        AuthenticationMode = AuthenticationMode.Active,
        MetadataAddress = metadataAddress,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = clientId,
            ValidateIssuer = true,
            // 处理B2C的特殊Issuer格式,这是很多人踩坑的点
            IssuerValidator = (issuer, token, parameters) =>
            {
                var validIssuer = $"https://{b2cTenant}.b2clogin.com/{Guid.Parse(token.Subject.Split('.')[0])}/v2.0/";
                if (issuer == validIssuer)
                {
                    return issuer;
                }
                throw new SecurityTokenInvalidIssuerException("无效的Issuer");
            }
        },
        AuthenticationType = policyName
    });

    // 将Web API挂载到Owin管道
    app.UseWebApi(config);
}

4. 配置Web API授权规则

修改WebApiConfig.cs,全局启用授权(也可以只在需要认证的控制器/方法上加[Authorize]):

public static class WebApiConfig
{
    public static void Configure(HttpConfiguration config)
    {
        // 启用属性路由
        config.MapHttpAttributeRoutes();

        // 默认路由配置
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // 全局添加授权过滤器,所有API默认需要认证
        config.Filters.Add(new AuthorizeAttribute());
    }
}

5. 读取令牌中的声明

在API控制器里,直接通过User.Claims集合就能获取令牌里的所有声明:

public class UserInfoController : ApiController
{
    [HttpGet]
    public IHttpActionResult GetCurrentUser()
    {
        // 获取用户唯一ID
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        // 获取用户邮箱
        var email = User.FindFirst(ClaimTypes.Email)?.Value;
        // 获取自定义声明(如果你的B2C策略配置了自定义属性)
        var customClaim = User.FindFirst("extension_myCustomAttribute")?.Value;

        return Ok(new 
        { 
            UserId = userId, 
            Email = email, 
            CustomAttribute = customClaim 
        });
    }
}

常见失败原因排查

  • 元数据地址错误:确认策略名称和租户域名完全匹配,比如策略名称是B2C_1_xxx不要漏前缀
  • HTTPS要求:Azure AD B2C要求API必须在HTTPS环境下运行,本地调试用IIS Express的HTTPS即可
  • 客户端ID不匹配:ValidAudience必须和B2C应用注册里的客户端ID完全一致
  • Issuer验证失败:B2C的Issuer包含租户GUID,必须用自定义验证器处理,不能直接用默认规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:41:22