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

如何在Blazor WASM的OIDC配置中指定验证用的Audience?

问题:Blazor WASM中OIDC令牌Audience验证失败

场景与配置

我在Blazor WASM应用中通过第三方IdP的OIDC做身份认证,OIDC中间件配置如下:

builder.Services.AddOidcAuthentication(options =>
{
    // 配置认证提供商选项
    builder.Configuration.Bind("MyIdpSettings", options.ProviderOptions);
    options.ProviderOptions.ResponseType = OpenIdConnectResponseType.Code;
});

appsettings.json中的配置:

"MyIdpSettings": {
  "Authority": "[AUTHORITY AS URL]",
  "ClientId": "[CLIENT ID AS GUID]"
}

错误现象

应用能正常重定向到IdP完成认证,也能正确跳转回WASM应用,但令牌验证环节失败,报错发生在MSAL的AuthenticationService.js第11120行附近的JWT属性验证逻辑:

t.validateJwtAttributes = function (e, r, i, o, s, a) {
    o || (o = 0),
        s || (s = parseInt(Date.now() / 1e3));
    var u = t.parseJwt(e).payload;
    if (!u.iss)
        return n.Log.error("JoseUtil._validateJwt: issuer was not provided"),
            Promise.reject(new Error("issuer was not provided"));
    if (u.iss !== r)
        return n.Log.error("JoseUtil._validateJwt: Invalid issuer in token", u.iss),
            Promise.reject(new Error("Invalid issuer in token: " + u.iss));
    if (!u.aud)
        return n.Log.error("JoseUtil._validateJwt: aud was not provided"),
            Promise.reject(new Error("aud was not provided"));
    if (!(u.aud === i || Array.isArray(u.aud) && u.aud.indexOf(i) >= 0))  // 此处验证失败
        return n.Log.error("JoseUtil._validateJwt: Invalid audience in token", u.aud),
            Promise.reject(new Error("Invalid audience in token: " + u.aud));
    if (u.azp && u.azp !== i)
        return n.Log.error("JoseUtil._validateJwt: Invalid azp in token", u.azp),
            Promise.reject(new Error("Invalid azp in token: " + u.azp));

IdP返回的JWT中aud字段是我在IdP配置里设置的自定义值(符合预期),但MSAL在验证时用的是中间件配置里的ClientId作为预期Audience,导致两者不匹配验证失败。

已尝试的无效操作

我曾尝试在中间件配置中添加以下代码,但没有效果:

options.ProviderOptions.AdditionalProviderParameters["audience"] = "[CUSTOM AUDIENCE]";

解决方案

要指定MSAL验证令牌时使用的Audience,需要配置令牌验证参数,而不是发给IdP的额外参数。修改中间件配置如下:

builder.Services.AddOidcAuthentication(options =>
{
    builder.Configuration.Bind("MyIdpSettings", options.ProviderOptions);
    options.ProviderOptions.ResponseType = OpenIdConnectResponseType.Code;

    // 设置令牌验证的合法Audience
    options.TokenValidationParameters = new TokenValidationParameters
    {
        // 如果只需要自定义Audience,用ValidAudience
        // ValidAudience = "[CUSTOM AUDIENCE]",
        // 如果同时需要ClientId和自定义Audience,用ValidAudiences
        ValidAudiences = new[] { "[CUSTOM AUDIENCE]", "[CLIENT ID AS GUID]" }
    };
});

说明

  • AdditionalProviderParameters是用来向IdP发送额外请求参数的(比如让IdP返回指定Audience的令牌),但不会改变本地验证时的预期Audience。
  • TokenValidationParameters才是控制本地JWT验证规则的配置,通过ValidAudience或ValidAudiences可以指定合法的Audience列表,让MSAL接受IdP返回的自定义Audience值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:53:11