我使用 OIDC 和第三方 IdP 对我的 Blazor WASM 应用程序进行身份验证。我使用 oidc 中间件:
builder.Services.AddOidcAuthentication(options =>
{
// Configure your authentication provider options here.
// For more information, see https://aka.ms/blazor-standalone-auth
builder.Configuration.Bind("MyIdpSettings", options.ProviderOptions);
options.ProviderOptions.ResponseType = OpenIdConnectResponseType.Code;
});
在我的 appsettings.json 中:
"MyIdpSettings": {
"Authority": "[AUTHORITY AS URL]",
"ClientId": "[CLIENT ID AS GUID]"
}
应用程序正确重定向到 IdP。 IdP 正确进行身份验证并重定向回 WASM 应用程序。 WASM 应用程序接收 JWT 进行处理,并尝试验证。
验证在 AuthenticationService.js (MSAL) 的第 11120 行附近失败
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)) <<---- FAILS HERE
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 返回的受众是我在 IdP 提供的配置工具中设置的受众(即 JWT 中的受众是“正确的”且符合预期)。
MSAL javascript 希望受众是 AddOidcAuthentication 中间件配置中指定的“ClientId”。
换句话说,上面的 u.aud 是“[MY CUSTOM AUDIENCE]”,而上面的 i 是“[CLIENT ID AS GUID]”。
如何指定 MSAL 将用于验证令牌的受众值?
我尝试过,在中间件的配置中,类似:
options.ProviderOptions.AdditionalProviderParameters["audience"] = "[CUSTOM AUDIENCE]";
但这没有任何效果。 (我认为这会更改对 IdP 的请求...?不是 MSAL 验证响应的方式...?)
但是应用程序设置不完整,无法请求自定义受众的令牌。 “Audience”是下游api项目,也在IDP中注册。这个API应该有特定的“范围”。
所以你只需要添加具体的范围,那么对应的“受众”就会在token中。
options.ProviderOptions.DefaultScopes.Add("downstream_api.read"); //The scoped you configured for downstreampi in IDP
并且前端不应该进行受众验证(WASM)。验证发生在后端 api 中,以检查令牌是否具有相应的“受众”和“范围”。
此外,我使用了身份服务器和keycloak,没有任何问题。如果我们知道什么是 IDP 以及如何配置“受众”,这可能会有所帮助。