in src/Saas.Identity/Saas.Permissions/Saas.Permissions.Service_v1.1/Controllers/CustomClaimsController.cs [8:78]
public class CustomClaimsController(IPermissionsService permissionsService, ILogger<CustomClaimsController> logger) : ControllerBase
{
private readonly IPermissionsService _permissionsService = permissionsService;
private readonly ILogger _logger = logger;
// This is the endpoint that is called by Azure AD B2C to get alle the custom claims defined for a specific user.
[HttpPost("permissions")]
[Produces("application/json")]
[ProducesResponseType(typeof(PermissionsClaimResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> Permissions(ClaimsRequest request)
{
_logger.LogDebug("Custom claims where requested for user id: {objectId}", request.ObjectId);
// Get all the permissions defined for the specific user with requested objectId from the database.
var permissions = await _permissionsService.GetPermissionsAsync(request.ObjectId);
IEnumerable<string> permissionClaims = new List<string>();
foreach (var permission in permissions)
{
// adding user permission to permissionsClaims list
if (permission.UserPermissions?.Any() ?? false)
{
permissionClaims = permissionClaims
.Concat(permissions.SelectMany(permission => permission.UserPermissions)
.Select(user => user.ToClaim()));
}
// adding tenant permissions to permissionsClaims list
if (permission.TenantPermissions?.Any() ?? false)
{
permissionClaims = permissionClaims
.Concat(permissions.SelectMany(permission => permission.TenantPermissions)
.Select(tenant => tenant.ToClaim()));
}
}
PermissionsClaimResponse response = new()
{
Permissions = permissionClaims.ToArray()
};
return Ok(response);
}
[HttpPost("roles")]
[Produces("application/json")]
[ProducesResponseType(typeof(RolesClaimResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> Roles(ClaimsRequest request)
{
// This request is currently retuning an empty list only.
// The MS Graph call is expensive and we don't need it for now.
// Also having a MS Graph call in the login flow is not ideal, as high volume of logins may hit MS Graph throttloing limits.
// var roles = await _graphAPIService.GetAppRolesAsync(request);
RolesClaimResponse response = new()
{
Roles = []
};
await Task.CompletedTask;
return Ok(response);
}
}