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

Blazor集成OpenIDDict Azure生产环境间歇性无效颁发者问题

解决Blazor部署Azure App Service后OpenIDDict间歇性发行者无效登录故障

部署Blazor应用到Azure App Service生产环境后,用户从OpenIDDict服务器重定向回站点时偶尔触发以下错误:

error:invalid_token
error_description:The issuer associated to the specified token is not valid.
error_uri:https://documentation.openiddict.com/errors/ID2088

刷新页面可恢复,但普通用户无法自行操作,该问题仅在生产环境出现,客户端配置基于OpenIDDict的dantooine WebAssembly示例,配置代码如下:

#region OpedIdDict

builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseSqlite(...);
    options.UseOpenIddict();
});

builder.Services.AddAntiforgery(options =>
{
    options.HeaderName = ...;
    options.Cookie.Name = ...;
    options.Cookie.SameSite = SameSiteMode.Strict;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    options.LoginPath = ...;
    options.LogoutPath = ...;
    options.ExpireTimeSpan = ...;
    options.SlidingExpiration = false;
    options.ClaimsIssuer = ...;
});

builder.Services.AddQuartz(options =>
{
    options.UseMicrosoftDependencyInjectionJobFactory();
    options.UseSimpleTypeLoader();
    options.UseInMemoryStore();
});

builder.Services.AddQuartzHostedService(options => options.WaitForJobsToComplete = true);

builder.Services.AddOpenIddict()

    .AddCore(options =>
    {
        options.UseEntityFrameworkCore().UseDbContext<ApplicationDbContext>();
        options.UseQuartz();
    })

    .AddClient(options =>
    {
        options.AllowAuthorizationCodeFlow();

        var certificate = ...;
        options.AddSigningCertificate(certificate);
        options.AddEncryptionCertificate(certificate);

        options.UseAspNetCore()
                .EnableStatusCodePagesIntegration()
                .EnableRedirectionEndpointPassthrough()
                .EnablePostLogoutRedirectionEndpointPassthrough();

        options.UseSystemNetHttp()
                .SetProductInformation(typeof(Program).Assembly);

        
        options.AddRegistration(new OpenIddictClientRegistration
        {
            Issuer = ...,
            ClientId = ...,
            ClientSecret = ...,
            Scopes = { Scopes.Profile, Scopes.Email, Scopes.Phone },
            RedirectUri = new Uri(...),
            PostLogoutRedirectUri = new Uri(...)
        });
    });

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("CookieAuthenticationPolicy", builder =>
    {
        builder.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
        builder.RequireAuthenticatedUser();
    });
});

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddTransforms(builder => builder.AddRequestTransform(async context =>
    {
        var token = await context.HttpContext.GetTokenAsync(
            scheme: CookieAuthenticationDefaults.AuthenticationScheme,
            tokenName: Tokens.BackchannelAccessToken);

        context.ProxyRequest.Headers.Authorization = new AuthenticationHeaderValue(Schemes.Bearer, token);
    }));

builder.Services.AddHostedService<Worker>();

#endregion

排查与解决步骤

  • 确保发行者URI完全匹配
    Azure App Service默认域名(如xxx.azurewebsites.net)与自定义域名共存时,若OpenIDDict服务器返回的发行者URI是自定义域名,而应用偶尔使用默认域名处理请求,会触发发行者验证失败。
    解决:客户端配置的Issuer必须和OpenIDDict服务器的发行者URI完全一致;在Azure App Service中开启强制HTTPS,并确保自定义域名绑定为主域名,避免应用使用默认域名处理请求。

  • 验证证书配置稳定性
    生产环境若使用Azure Key Vault托管证书,可能出现证书加载延迟或不一致,导致令牌签名验证失败,间接触发发行者错误。
    解决:确认客户端加载的证书与服务器使用的证书完全匹配;若用Key Vault,配置证书自动刷新机制,保证应用能及时获取有效证书。

  • 统一分布式环境下的元数据缓存
    多实例部署时,各实例的OpenIDDict元数据内存缓存可能不一致,部分实例缓存过期导致验证失败。
    解决:配置OpenIDDict客户端使用Azure Redis Cache等分布式缓存存储元数据;调整元数据缓存过期时间,确保所有实例同步最新发行者配置。

  • 调整Cookie的SameSite属性
    SameSiteMode.Strict可能导致跨域重定向时Cookie无法正确传递,引发发行者匹配问题。
    解决:将SameSiteMode改为Lax,确保重定向时必要Cookie正常传递,同时保留CookieSecurePolicy.Always保障HTTPS环境下的Cookie安全。

  • 修正反向代理的头部传递
    反向代理若未传递原始请求主机头,应用会基于代理内部域名验证发行者,导致不匹配。
    解决:在反向代理配置中添加头部转换,传递X-Forwarded-Host等头部,让应用获取原始请求的主机名,正确验证令牌发行者。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:47:12