如何在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
相关产品推荐
相关产品推荐

