Skip to content

Commit

Permalink
[Az.Resources] skip client side validation for RoleAssignment & RoleD…
Browse files Browse the repository at this point in the history
…efinition commands (Azure#24037)

* skip client side validation for RoleAssignment commands

* skip client side validation for RoleDefinition commands

* skip client side validation for RoleDefinition commands

* Update ChangeLog.md
  • Loading branch information
NoriZC authored Jan 26, 2024
1 parent 228710a commit b49c123
Show file tree
Hide file tree
Showing 17 changed files with 273 additions and 69 deletions.
1 change: 1 addition & 0 deletions src/Resources/Resources/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
-->

## Upcoming Release
* Supported `-SkipClientSideScopeValidation` in RoleAssignment and RoleDefinition related commands. [#22473]
* Updated Bicep build logic to use --stdout flag instead of creating a temporary file on disk.
* Fixed exception when `-ApiVersion` is specified for `Get-AzResource`, affected by some resource types.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,9 @@ public class GetAzureRoleAssignmentCommand : ResourcesBaseCmdlet
HelpMessage = "If specified, also returns the subscription classic administrators as role assignments.")]
public SwitchParameter IncludeClassicAdministrators { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

#endregion


Expand Down Expand Up @@ -251,7 +254,10 @@ public override void ExecuteCmdlet()
WriteTerminatingError(ProjectResources.ScopeAndSubscriptionNeitherProvided);
}

AuthorizationClient.ValidateScope(options.Scope, true);
if (!SkipClientSideScopeValidation.IsPresent)
{
AuthorizationClient.ValidateScope(options.Scope, true);
}

List<PSRoleAssignment> ra = PoliciesClient.FilterRoleAssignments(options, DefaultProfile.DefaultContext.Subscription?.Id?.ToString());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,9 @@ public class NewAzureRoleAssignmentCommand : ResourcesBaseCmdlet
[ValidateNotNullOrEmpty]
public SwitchParameter AllowDelegation { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

#endregion

public Guid RoleAssignmentId { get; set; } = default(Guid);
Expand Down Expand Up @@ -337,7 +340,10 @@ public override void ExecuteCmdlet()
WriteTerminatingError(ProjectResources.ScopeAndSubscriptionNeitherProvided);
}

AuthorizationClient.ValidateScope(parameters.Scope, true);
if (!SkipClientSideScopeValidation.IsPresent)
{
AuthorizationClient.ValidateScope(parameters.Scope, true);
}

WriteObject(PoliciesClient.CreateRoleAssignment(parameters, RoleAssignmentId));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,9 @@ public class RemoveAzureRoleAssignmentCommand : ResourcesBaseCmdlet
[Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ParameterSetName = ParameterSet.RoleAssignment, HelpMessage = "Role Assignment.")]
public PSRoleAssignment InputObject { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

public override void ExecuteCmdlet()
{
IEnumerable<PSRoleAssignment> roleAssignments = null;
Expand Down Expand Up @@ -201,7 +204,11 @@ public override void ExecuteCmdlet()
WriteTerminatingError(ProjectResources.ScopeAndSubscriptionNeitherProvided);
}

AuthorizationClient.ValidateScope(options.Scope, true);
if (!SkipClientSideScopeValidation.IsPresent)
{
AuthorizationClient.ValidateScope(options.Scope, true);
}

ConfirmAction(
string.Format(ProjectResources.RemovingRoleAssignment, ObjectId, Scope, RoleDefinitionName),
ObjectId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ public class SetAzureRoleAssignmentCommand : ResourcesBaseCmdlet
[Parameter(Mandatory = true, ValueFromPipeline = true, ParameterSetName = ParameterSet.RoleAssignment, HelpMessage = "Role Assignment.")]
public PSRoleAssignment InputObject { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

[Parameter(Mandatory = false)]
public SwitchParameter PassThru { get; set; }
#endregion
Expand Down Expand Up @@ -95,7 +98,10 @@ public override void ExecuteCmdlet()
}

// Validate the request
AuthorizationClient.ValidateScope(parameters.Scope, false);
if (!SkipClientSideScopeValidation.IsPresent)
{
AuthorizationClient.ValidateScope(parameters.Scope, false);
}
bool isValidRequest = true;

// Check that only Description, Condition and ConditionVersion have been changed, if anything else is changed the whole request fails
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ public class GetAzureRoleDefinitionCommand : ResourcesBaseCmdlet
HelpMessage = "If specified, only displays the custom created roles in the directory.")]
public SwitchParameter Custom { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

#endregion


Expand All @@ -73,7 +76,10 @@ public override void ExecuteCmdlet()
WriteTerminatingError(ProjectResources.ScopeAndSubscriptionNeitherProvided);
}

AuthorizationClient.ValidateScope(options.Scope, true);
if (!SkipClientSideScopeValidation.IsPresent)
{
AuthorizationClient.ValidateScope(options.Scope, true);
}

IEnumerable<PSRoleDefinition> filteredRoleDefinitions = PoliciesClient.FilterRoleDefinitions(options);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ public class NewAzureRoleDefinitionCommand : ResourcesBaseCmdlet

public Guid RoleDefinitionId { get; set; } = default(Guid);

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

public override void ExecuteCmdlet()
{
PSRoleDefinition role = null;
Expand All @@ -67,8 +70,12 @@ public override void ExecuteCmdlet()
role = Role;
}

foreach(var scope in role.AssignableScopes) {
AuthorizationClient.ValidateScope(scope, false);
if (!SkipClientSideScopeValidation.IsPresent)
{
foreach (var scope in role.AssignableScopes)
{
AuthorizationClient.ValidateScope(scope, false);
}
}

WriteObject(PoliciesClient.CreateRoleDefinition(role, RoleDefinitionId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ public class RemoveAzureRoleDefinitionCommand : ResourcesBaseCmdlet
[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = ParameterSet.RoleDefinitionId, HelpMessage = "Scope of the existing role definition.")]
public string Scope { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

[Parameter(Mandatory = false)]
public SwitchParameter Force { get; set; }

Expand Down Expand Up @@ -98,7 +101,10 @@ public override void ExecuteCmdlet()
WriteTerminatingError(ProjectResources.ScopeAndSubscriptionNeitherProvided);
}

AuthorizationClient.ValidateScope(options.Scope, true);
if (!SkipClientSideScopeValidation.IsPresent)
{
AuthorizationClient.ValidateScope(options.Scope, true);
}

ConfirmAction(
Force.IsPresent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ public class SetAzureRoleDefinitionCommand : ResourcesBaseCmdlet
[Parameter(Mandatory = true, ValueFromPipeline = true, ParameterSetName = ParameterSet.RoleDefinition, HelpMessage = "Role definition.")]
public PSRoleDefinition Role { get; set; }

[Parameter(Mandatory = false, HelpMessage = "If specified, skip client side scope validation.")]
public SwitchParameter SkipClientSideScopeValidation { get; set; }

public override void ExecuteCmdlet()
{
PSRoleDefinition role = null;
Expand All @@ -62,8 +65,12 @@ public override void ExecuteCmdlet()

role = role ?? Role;

foreach (var scope in role.AssignableScopes) {
AuthorizationClient.ValidateScope(scope, false);
if (!SkipClientSideScopeValidation.IsPresent)
{
foreach (var scope in role.AssignableScopes)
{
AuthorizationClient.ValidateScope(scope, false);
}
}

WriteObject(PoliciesClient.UpdateRoleDefinition(role));
Expand Down
61 changes: 44 additions & 17 deletions src/Resources/Resources/help/Get-AzRoleAssignment.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,107 +28,119 @@ Please notice that this cmdlet will mark `ObjectType` as `Unknown` in output if
### EmptyParameterSet (Default)
```
Get-AzRoleAssignment [-RoleDefinitionName <String>] [-IncludeClassicAdministrators]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### ObjectIdParameterSet
```
Get-AzRoleAssignment -ObjectId <String> [-RoleDefinitionName <String>] [-ExpandPrincipalGroups]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceGroupWithObjectIdParameterSet
```
Get-AzRoleAssignment -ObjectId <String> -ResourceGroupName <String> [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceWithObjectIdParameterSet
```
Get-AzRoleAssignment -ObjectId <String> -ResourceGroupName <String> -ResourceName <String>
-ResourceType <String> [-ParentResource <String>] [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ScopeWithObjectIdParameterSet
```
Get-AzRoleAssignment -ObjectId <String> [-RoleDefinitionName <String>] -Scope <String>
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### RoleIdWithScopeAndObjectIdParameterSet
```
Get-AzRoleAssignment [-ObjectId <String>] -RoleDefinitionId <Guid> [-Scope <String>]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### ResourceGroupWithSignInNameParameterSet
```
Get-AzRoleAssignment -SignInName <String> -ResourceGroupName <String> [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceWithSignInNameParameterSet
```
Get-AzRoleAssignment -SignInName <String> -ResourceGroupName <String> -ResourceName <String>
-ResourceType <String> [-ParentResource <String>] [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ScopeWithSignInNameParameterSet
```
Get-AzRoleAssignment -SignInName <String> [-RoleDefinitionName <String>] -Scope <String>
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### SignInNameParameterSet
```
Get-AzRoleAssignment -SignInName <String> [-RoleDefinitionName <String>] [-ExpandPrincipalGroups]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceGroupWithSPNParameterSet
```
Get-AzRoleAssignment -ServicePrincipalName <String> -ResourceGroupName <String> [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceWithSPNParameterSet
```
Get-AzRoleAssignment -ServicePrincipalName <String> -ResourceGroupName <String> -ResourceName <String>
-ResourceType <String> [-ParentResource <String>] [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ScopeWithSPNParameterSet
```
Get-AzRoleAssignment -ServicePrincipalName <String> [-RoleDefinitionName <String>] -Scope <String>
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### SPNParameterSet
```
Get-AzRoleAssignment -ServicePrincipalName <String> [-RoleDefinitionName <String>]
[-IncludeClassicAdministrators] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-IncludeClassicAdministrators] [-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceGroupParameterSet
```
Get-AzRoleAssignment -ResourceGroupName <String> [-RoleDefinitionName <String>] [-IncludeClassicAdministrators]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### ResourceParameterSet
```
Get-AzRoleAssignment -ResourceGroupName <String> -ResourceName <String> -ResourceType <String>
[-ParentResource <String>] [-RoleDefinitionName <String>] [-IncludeClassicAdministrators]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### ScopeParameterSet
```
Get-AzRoleAssignment [-RoleDefinitionName <String>] -Scope <String> [-IncludeClassicAdministrators]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
[-SkipClientSideScopeValidation] [-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

## DESCRIPTION
Expand Down Expand Up @@ -426,6 +438,21 @@ Accept pipeline input: True (ByPropertyName)
Accept wildcard characters: False
```
### -SkipClientSideScopeValidation
If specified, skip client side scope validation.
```yaml
Type: System.Management.Automation.SwitchParameter
Parameter Sets: (All)
Aliases:

Required: False
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### CommonParameters
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
Expand Down
27 changes: 21 additions & 6 deletions src/Resources/Resources/help/Get-AzRoleDefinition.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@ Lists all Azure RBAC roles that are available for assignment.

### RoleDefinitionNameParameterSet (Default)
```
Get-AzRoleDefinition [[-Name] <String>] [-Scope <String>] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
Get-AzRoleDefinition [[-Name] <String>] [-Scope <String>] [-SkipClientSideScopeValidation]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### RoleDefinitionIdParameterSet
```
Get-AzRoleDefinition -Id <Guid> [-Scope <String>] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
Get-AzRoleDefinition -Id <Guid> [-Scope <String>] [-SkipClientSideScopeValidation]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### RoleDefinitionCustomParameterSet
```
Get-AzRoleDefinition [-Scope <String>] [-Custom] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
Get-AzRoleDefinition [-Scope <String>] [-Custom] [-SkipClientSideScopeValidation]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

## DESCRIPTION
Expand Down Expand Up @@ -130,6 +130,21 @@ Accept pipeline input: True (ByValue)
Accept wildcard characters: False
```
### -SkipClientSideScopeValidation
If specified, skip client side scope validation.
```yaml
Type: System.Management.Automation.SwitchParameter
Parameter Sets: (All)
Aliases:

Required: False
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### CommonParameters
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
Expand Down
Loading

0 comments on commit b49c123

Please sign in to comment.