{"record":{"id":"64a4c578c1093db5","repo":"microsoft/aspire","slug":"unsupported-provider-supported-providers-are-microsoft-and","errorCode":null,"errorMessage":"Unsupported provider. Supported providers are 'microsoft' and 'github'.","messagePattern":"Unsupported provider\\. Supported providers are 'microsoft' and 'github'\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.DevTunnels/DevTunnelCliClient.cs","lineNumber":278,"sourceCode":"    }\n\n    public async Task<UserLoginStatus> GetUserLoginStatusAsync(ILogger? logger = default, CancellationToken cancellationToken = default)\n    {\n        logger?.LogTrace(\"Getting dev tunnel user login status.\");\n        var (login, exitCode, error) = await CallCliAsJsonAsync<UserLoginStatus>(\n            _cli.UserStatusAsync,\n            logger, cancellationToken).ConfigureAwait(false);\n        return login ?? throw new DistributedApplicationException($\"Failed to get user login status. Exit code {exitCode}: {error}\");\n    }\n\n    public async Task<UserLoginStatus> UserLoginAsync(LoginProvider provider, ILogger? logger = default, CancellationToken cancellationToken = default)\n    {\n        logger?.LogTrace(\"Logging in to dev tunnel service using {LoginProvider}.\", provider);\n        var exitCode = provider switch\n        {\n            LoginProvider.Microsoft => await _cli.UserLoginMicrosoftAsync(logger, cancellationToken).ConfigureAwait(false),\n            LoginProvider.GitHub => await _cli.UserLoginGitHubAsync(logger, cancellationToken).ConfigureAwait(false),\n            _ => throw new ArgumentException(\"Unsupported provider. Supported providers are 'microsoft' and 'github'.\", nameof(provider)),\n        };\n\n        if (exitCode == 0)\n        {\n            // Login succeeded, get the login status\n            return await GetUserLoginStatusAsync(logger, cancellationToken).ConfigureAwait(false);\n        }\n\n        throw new DistributedApplicationException($\"Failed to perform user login. Process finished with exit code: {exitCode}\");\n    }\n\n    private async Task<(T? Result, int ExitCode, string? Error)> CallCliAsJsonAsync<T>(Func<TextWriter, TextWriter, ILogger?, CancellationToken, Task<int>> cliCall, ILogger? logger = default, CancellationToken cancellationToken = default)\n    {\n        return await CallCliAsJsonAsync<T>(cliCall, propertyName: null, logger, cancellationToken).ConfigureAwait(false);\n    }\n\n    private async Task<(T? Result, int ExitCode, string? Error)> CallCliAsJsonAsync<T>(Func<TextWriter, TextWriter, ILogger?, CancellationToken, Task<int>> cliCall, string? propertyName, ILogger? logger = default, CancellationToken cancellationToken = default)\n    {","sourceCodeStart":260,"sourceCodeEnd":296,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.DevTunnels/DevTunnelCliClient.cs#L260-L296","documentation":"UserLoginAsync accepts a LoginProvider enum/constant and only supports Microsoft and GitHub. Any other value hits the switch's default arm and throws ArgumentException naming the offending `provider` argument.","triggerScenarios":"Calling UserLoginAsync with a LoginProvider value other than LoginProvider.Microsoft or LoginProvider.GitHub — e.g. a casted integer, a custom constant, or a provider added in a newer CLI but not yet mapped here.","commonSituations":"Reading the provider from configuration where the string isn't mapped correctly to the enum; passing default(LoginProvider) which may not equal a supported member.","solutions":["Pass LoginProvider.Microsoft or LoginProvider.GitHub explicitly","If the provider comes from config, map/parse it and validate against the two supported values before calling","Check the LoginProvider type for the correct member names in your package version"],"exampleFix":"// before\nawait client.UserLoginAsync((LoginProvider)5, logger); // throws\n// after\nvar provider = LoginProvider.GitHub; // or LoginProvider.Microsoft\nawait client.UserLoginAsync(provider, logger);","handlingStrategy":"validation","validationCode":"if (provider is not (LoginProvider.Microsoft or LoginProvider.GitHub))\n    throw new ArgumentException($\"Provider must be Microsoft or GitHub, got {provider}\", nameof(provider));","typeGuard":"static bool IsSupportedProvider(LoginProvider p) => p is LoginProvider.Microsoft or LoginProvider.GitHub;","tryCatchPattern":null,"preventionTips":["Only pass LoginProvider.Microsoft or LoginProvider.GitHub","Validate config-sourced provider strings against the enum before use","Avoid integer casts to LoginProvider"],"tags":["devtunnels","argument","enum"],"backgroundTag":"unsupported-enum-value","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}