使用 OIDC 在 Blazor WASM 中配置要验证的受众

问题描述 投票:0回答:1

我使用 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 验证响应的方式...?)

c# asp.net-core openid-connect blazor-webassembly
1个回答
0
投票

但是应用程序设置不完整,无法请求自定义受众的令牌。 “Audience”是下游api项目,也在IDP中注册。这个API应该有特定的“范围”。

所以你只需要添加具体的范围,那么对应的“受众”就会在token中。

options.ProviderOptions.DefaultScopes.Add("downstream_api.read");  //The scoped you configured for downstreampi in IDP

并且前端不应该进行受众验证(WASM)。验证发生在后端 api 中,以检查令牌是否具有相应的“受众”和“范围”。

此外,我使用了身份服务器和keycloak,没有任何问题。如果我们知道什么是 IDP 以及如何配置“受众”,这可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.