bitwarden/server · error · BadRequestException

Organizations must not be assigned to any Provider.

Error message

Organizations must not be assigned to any Provider.

What it means

Thrown by ProviderService.AddOrganizationsToReseller after confirming the provider is a Reseller, when GetCountByOrganizationIdsAsync returns > 0 meaning one or more of the requested organizationIds are already linked to some provider. BadRequestException (HTTP 400).

Source

Thrown at bitwarden_license/src/Commercial.Core/AdminConsole/Services/ProviderService.cs:489

            });
        }

        await _eventService.LogProviderOrganizationEventAsync(providerOrganization, EventType.ProviderOrganization_Added);
    }

    public async Task AddOrganizationsToReseller(Guid providerId, IEnumerable<Guid> organizationIds)
    {
        var provider = await _providerRepository.GetByIdAsync(providerId);
        if (provider.Type != ProviderType.Reseller)
        {
            throw new BadRequestException("Provider must be of type Reseller in order to assign Organizations to it.");
        }

        var orgIdsList = organizationIds.ToList();
        var existingProviderOrganizationsCount = await _providerOrganizationRepository.GetCountByOrganizationIdsAsync(orgIdsList);
        if (existingProviderOrganizationsCount > 0)
        {
            throw new BadRequestException("Organizations must not be assigned to any Provider.");
        }

        var providerOrganizationsToInsert = orgIdsList.Select(orgId => new ProviderOrganization { ProviderId = providerId, OrganizationId = orgId });
        var insertedProviderOrganizations = await _providerOrganizationRepository.CreateManyAsync(providerOrganizationsToInsert);

        await _eventService.LogProviderOrganizationEventsAsync(insertedProviderOrganizations.Select(ipo => (ipo, EventType.ProviderOrganization_Added, (DateTime?)null)));
    }

    private async Task ApplyProviderPriceRateAsync(Organization organization, Provider provider)
    {
        // if a provider was created before Nov 6, 2023.If true, the organization plan assigned to that provider is updated to a 2020 plan.
        if (provider.CreationDate >= Constants.ProviderCreatedPriorNov62023)
        {
            return;
        }

        if (!string.IsNullOrWhiteSpace(organization.GatewaySubscriptionId))
        {

View on GitHub (pinned to e93b962371)

Solutions

  1. Call GetCountByOrganizationIdsAsync(orgIds) (or filter GetByOrganizationId per id) and exclude already-linked orgs.
  2. Remove existing ProviderOrganization rows for orgs you intend to reassign before resubmitting.
  3. Dedupe the organizationIds list before submission.

Example fix

// before
await providerService.AddOrganizationsToReseller(providerId, orgIds);

// after
var linked = orgIds.Where(id =>
    (await providerOrganizationRepository.GetByOrganizationId(id)) != null);
var freeOrgIds = orgIds.Except(linked).Distinct().ToList();
await providerService.AddOrganizationsToReseller(providerId, freeOrgIds);
Defensive patterns

Strategy: validation

Validate before calling

var count = await providerOrganizationRepository.GetCountByOrganizationIdsAsync(orgIds);
if (count > 0) { /* filter out already-linked orgs */ }

Try / catch

try { await providerService.AddOrganizationsToReseller(providerId, orgIds); }
catch (BadRequestException ex) when (ex.Message.Contains("must not be assigned")) { /* refresh list, retry unlinked */ }

Prevention

When it happens

Trigger: Bulk-assigning a set of org IDs to a reseller where at least one org already has a ProviderOrganization row (any provider).

Common situations: A partial retry of a failed batch where some orgs already linked; an admin who re-submits the whole list after the first org succeeded; duplicate IDs in the request.

Related errors


AI-assisted analysis of bitwarden/server@e93b962371 (2026-08-13). Data as JSON: /api/errors/10405e95ca9bda35. Report an issue: GitHub.