WebAssembly 的 IAuthenticationTokenProvider 在请求令牌时崩溃

WebAssembly's IAuthenticationTokenProvider crashes when requesting a token

我正在尝试使用 google 的 OIDC 在我的 WASM Blazor 应用程序中对用户进行身份验证。 我已经按照这篇文章设法取回了令牌:https://docs.microsoft.com/en-gb/aspnet/core/blazor/security/webassembly/standalone-with-authentication-library?view=aspnetcore-3.1&tabs=visual-studio

我正在尝试检索 AccessToken 以在构建 HubConnection 实例时使用 IAccessTokenProvider 的注入实例将其传递给 SignalR 集线器:

public RemoteCombatListener(ITokenCache tokenCache)
{
    _connection = new HubConnectionBuilder()
        .WithUrl("https://localhost:44364/combat", opts => {
            opts.AccessTokenProvider = tokenCache.GetToken;
        })
        .Build();
}

这是我的 TokenCache 的实现:

public class TokenCache : ITokenCache
{
    private readonly IAccessTokenProvider _tokenProvider;
    private readonly NavigationManager _navManager;
    public string CachedToken { get; private set; }

    public TokenCache(IAccessTokenProvider tokenProvider, NavigationManager navManager)
    {
        _tokenProvider = tokenProvider;
        _navManager = navManager;
    }

    public async Task<string> GetToken()
    {
        if (string.IsNullOrEmpty(CachedToken))
        {
            var requestedToken = await _tokenProvider.RequestAccessToken();
            if (requestedToken.TryGetToken(out var accessToken))
            {
                CachedToken = accessToken.Value;
            }
            else
            {
                throw new AccessTokenNotAvailableException(_navManager, requestedToken, Enumerable.Empty<string>());
            }
        }

        return CachedToken;
    }
}

我现在面临的问题是,在调用_tokenProvider.RequestAccessToken()方法时,出现以下异常:

An exception occurred executing JS interop: The JSON value could not be converted to System.DateTimeOffset. Path: $.token.expires | LineNumber: 0 | BytePositionInLine: 80.. See InnerException for more details.

我无法弄清楚我的设置有什么问题,因为调试随机停止为我工作,我唯一的选择是 Console.Log 调试。

事实证明,Oidc 的默认配置不请求 access_token,仅请求 id_token。必须添加以下内容:

builder.Services.AddOidcAuthentication(options => {
    // Rest of configs ...
    options.ProviderOptions.ResponseType = "id_token token";
});