{"record":{"id":"99c6c3c2d4626c9f","repo":"elsa-workflows/elsa-core","slug":"a-required-secret-binding-resolver-is-unavailable","errorCode":null,"errorMessage":"A required secret binding resolver is unavailable.","messagePattern":"A required secret binding resolver is unavailable\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/modules/Elsa.ExternalAuthentication/Services/DefaultExternalAuthenticationTokenIssuer.cs","lineNumber":100,"sourceCode":"        return new(\n            accessToken.Token,\n            \"Bearer\",\n            Math.Max(0, (long)(accessToken.ExpiresAt - now).TotalSeconds),\n            refreshToken,\n            Math.Max(0, (long)(session.RefreshExpiresAt - now).TotalSeconds),\n            Math.Max(0, (long)(session.ExpiresAt - now).TotalSeconds));\n    }\n\n    private static string CreateRefreshToken(string sessionId) => $\"{sessionId}.{Convert.ToBase64String(RandomNumberGenerator.GetBytes(32)).TrimEnd('=').Replace('+', '-').Replace('/', '_')}\";\n    private static string Hash(string token) => Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(token)));\n\n    private async ValueTask<string> GetSecretFingerprintAsync(IDictionary<string, SecretBinding> bindings, CancellationToken cancellationToken)\n    {\n        var fingerprints = new List<string>();\n        foreach (var (name, binding) in bindings)\n        {\n            var resolver = secretBindingResolvers.FirstOrDefault(x => string.Equals(x.Type, binding.ResolverType, StringComparison.Ordinal))\n                ?? throw new InvalidOperationException(\"A required secret binding resolver is unavailable.\");\n            var resolved = await resolver.ResolveAsync(binding, cancellationToken);\n            fingerprints.Add($\"{name}:{resolved.GenerationFingerprint}\");\n            resolved.Value.Dispose();\n        }\n        return Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(string.Join(\"\\n\", fingerprints.OrderBy(x => x, StringComparer.Ordinal)))));\n    }\n}\n","sourceCodeStart":82,"sourceCodeEnd":108,"githubUrl":"https://github.com/elsa-workflows/elsa-core/blob/fe9217bdfa0e27f0e09e45006eb6898f616e513d/src/modules/Elsa.ExternalAuthentication/Services/DefaultExternalAuthenticationTokenIssuer.cs#L82-L108","documentation":"Thrown by GetSecretFingerprintAsync (reached via RefreshAsync) when no ISecretBindingResolver capable of resolving the connection's secret binding is registered in the service provider. It indicates a misconfigured external-authentication installation: the secret binding's resolver type was never registered or the binding references an unknown resolver.","triggerScenarios":"Thrown at src/modules/Elsa.ExternalAuthentication/Services/DefaultExternalAuthenticationTokenIssuer.cs:100 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Register the ISecretBindingResolver implementation referenced by the connection's secret binding in DI before issuing or refreshing tokens.","Inspect the connection's secret binding and correct its ResolverType so it matches a registered resolver.","Verify the Elsa.ExternalAuthentication feature setup registered all built-in secret binding resolvers."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fe9217bdfa0e27f0e09e45006eb6898f616e513d","analyzedAt":"2026-09-13T20:32:34.702Z","contentChangedAt":"2026-09-13T20:32:34.702Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}