{"record":{"id":"ba081a5c6e6e2a78","repo":"microsoft/aspire","slug":"access-policy-resource-name-is-already-registered-on","errorCode":null,"errorMessage":"Access policy resource '{name}' is already registered on connector connection '{connection.Name}'.","messagePattern":"Access policy resource '(.+?)' is already registered on connector connection '(.+?)'\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Azure.ConnectorNamespace/AzureConnectorNamespaceExtensions.cs","lineNumber":671,"sourceCode":"        return new BinaryExpression(\n            value,\n            BinaryBicepOperator.Coalesce,\n            new StringLiteralExpression(string.Empty));\n    }\n\n    private static string GetValidatedAccessPolicyResourceName(\n        AzureConnectorNamespaceConnectionResource connection,\n        string name,\n        string policyName)\n    {\n        var resourceName = ConnectorNamespaceBicepIdentifiers.CreateAccessPolicy(\n            connection.Parent.Name,\n            connection.Name,\n            name);\n        if (connection.AccessPolicies.Any(policy =>\n            string.Equals(policy.BicepIdentifier, resourceName, StringComparison.OrdinalIgnoreCase)))\n        {\n            throw new InvalidOperationException(\n                $\"Access policy resource '{name}' is already registered on connector connection '{connection.Name}'.\");\n        }\n\n        if (connection.AccessPolicies.Any(policy =>\n            string.Equals(policy.PolicyName, policyName, StringComparison.OrdinalIgnoreCase)))\n        {\n            throw new InvalidOperationException(\n                $\"Access policy '{policyName}' is already registered on connector connection '{connection.Name}'.\");\n        }\n\n        return resourceName;\n    }\n\n    private static string GetValidatedMcpAccessPolicyResourceName(\n        AzureConnectorNamespaceMcpServerConfigResource config,\n        string name,\n        string objectId)\n    {","sourceCodeStart":653,"sourceCodeEnd":689,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Azure.ConnectorNamespace/AzureConnectorNamespaceExtensions.cs#L653-L689","documentation":"When adding an access policy to a connector connection, the derived Bicep identifier (resource name) must be unique among the policies already registered on that connection. GetValidatedAccessPolicyResourceName throws this InvalidOperationException when a policy with the same BicepIdentifier already exists on the connection.","triggerScenarios":"Calling WithAccessPolicy (or resourceName) twice on the same connector connection with the same resource name, ignoring case.","commonSituations":"Applying a shared extension/helper method that adds the same policy multiple times; duplicate builder configuration across code paths; case differences masking the duplicate.","solutions":["Use a different resource name for the new policy.","Remove the earlier WithAccessPolicy call that already registers the name on this connection.","Check connection.AccessPolicies before adding to skip already-registered names."],"exampleFix":"// before\nconnection.WithAccessPolicy(\"adminPolicy\", objectId, tenantId, PrincipalType.User);\nconnection.WithAccessPolicy(\"adminPolicy\", otherObjectId, tenantId, PrincipalType.User);\n// after\nconnection.WithAccessPolicy(\"adminPolicy\", objectId, tenantId, PrincipalType.User);\nconnection.WithAccessPolicy(\"adminPolicy2\", otherObjectId, tenantId, PrincipalType.User);","handlingStrategy":"validation","validationCode":"if (connection.AccessPolicies.Any(p => string.Equals(p.BicepIdentifier, name, StringComparison.OrdinalIgnoreCase)))\n{\n    // skip or rename before calling WithAccessPolicy\n}","typeGuard":null,"tryCatchPattern":"try { connection.WithAccessPolicy(name, objectId, tenantId, principalType); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"already registered\"))\n{\n    // choose a different resource name or skip\n}","preventionTips":["Track resource names you have already registered per connection.","Avoid shared helpers that unconditionally add the same policy.","Use distinct, descriptive policy resource names."],"tags":["azure","connector","access-policy","duplicate"],"backgroundTag":"file-already-exists","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"}