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

.NET Core 6 MVC集成Azure AD B2C时尾斜杠引发State为空错误

问题分析与解决方案

问题根源

核心问题出在回调路径配置不匹配和子路径下的路由/认证中间件路径解析错误:

  1. 你的应用部署在/TEST子路径下,但CallbackPath配置为/,导致Azure AD B2C的回调请求无法正确匹配到应用内的认证处理端点。
  2. 带尾斜杠的URL触发了路由路径的差异,使得OpenID Connect中间件生成的state参数与回调时验证的参数不匹配,最终抛出State is null or empty错误。

具体解决步骤

1. 修正Azure AD B2C回调路径配置

修改appsettings.json中的CallbackPath,匹配应用的子路径(默认的OpenID Connect回调端点是/signin-oidc):

"AzureAdB2C": {
  "CallbackPath": "/TEST/signin-oidc",
  "Instance": "https://<company name>.b2clogin.com",
  "ClientId": "*******",
  "Domain": "<companyname>.onmicrosoft.com",
  "ClientSecret": "*******",
  "SignedOutCallbackPath": "/TEST/signout/b2c_<company specific>_susi",
  "SignUpSignInPolicyId": "b2c_<company specific>_susi",
  "ResetPasswordPolicyId": "b2c_1_<company specific>_pwss"
}

同时登录Azure AD B2C门户,将**回复URL(Redirect URI)**更新为https://developmenturl.test.net/TEST/signin-oidc。

2. 配置应用基路径

告诉ASP.NET Core你的应用运行在/TEST子路径下,确保路由和认证中间件正确解析路径:

  • 如果你用的是.NET 6+的Program.cs顶级语句:
var builder = WebApplication.CreateBuilder(args);

// 添加基路径配置
builder.WebHost.UseBasePath("/TEST");

// 原有认证配置
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAdB2C")
    .EnableTokenAcquisitionToCallDownstreamApi(new string[] { })
    .AddInMemoryTokenCaches();

// 其他服务配置...

var app = builder.Build();

// 中间件管道配置
app.UsePathBase("/TEST"); // 需放在UseRouting之前
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
  • 如果你用的是Startup.cs:
    在Configure方法中,UseRouting之前添加:
app.UsePathBase("/TEST");

3. 强制移除URL尾斜杠(可选,从根源避免问题)

配置路由选项,自动将带尾斜杠的URL重定向到不带斜杠的版本:

builder.Services.Configure<RouteOptions>(options =>
{
    options.AppendTrailingSlash = false;
    options.LowercaseUrls = true; // 可选,统一URL为小写格式
});

4. 显式修正回调重定向URL(兜底验证)

如果上述步骤仍有问题,可通过OpenID Connect事件强制修正重定向URL:

builder.Services.Configure<OpenIdConnectOptions>(builder.Configuration.GetSection("AzureAdB2C"), options =>
{
    options.Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProvider = context =>
        {
            // 移除重定向URL末尾的斜杠,确保state参数匹配
            context.ProtocolMessage.RedirectUri = context.ProtocolMessage.RedirectUri.TrimEnd('/');
            return Task.CompletedTask;
        }
    };
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:20:44