Способ сделать это - переписать RoleStore по умолчанию и отфильтровать роли по арендатору в пользовательском RoleStore.
Для этого решения я предполагаю, что вы используете SaasKit для разрешения своих арендаторов, а пользовательский IdentityRole имеет свойство Tenant.
Если вы посмотрите на исходный код UserManager.AddToRoleAsyn c, они просто используют предоставленный RoleStore.
Так что если вы посмотрите на исходный код из RoleStore, вы можете видеть, что все запросы выполняются через свойство Roles. Добавив туда фильтр арендаторов, вы всегда можете получить соответствующую роль, предполагая, что арендатор разрешен.
Итак, пользовательский RoleStore:
public class TenantRoleStore : RoleStore<ApplicationRole<string>>
{
private readonly TenantContext<Tenant> _tenantContext;
public TenantRoleStore(
CustomDbContext context,
TenantContext<Tenant> tenantContext,
IdentityErrorDescriber describer = null)
: base(context, describer)
{
_tenantContext = tenantContext;
}
public override IQueryable<ApplicationRole<string>> Roles => base.Roles.Where(r => r.Tenant.Id == _tenantContext.Tenant.Id);
}
В запуске просто добавьте его, где вы настраиваете Identity :
services.AddIdentity()
.AddRoleStore<TenantRoleStore>(); // <- add this