Base solution for your next web application

Activities of "flaskone"

We would like to give tenants only limited option to manage permissions / roles. As part of the process, we have very granular permissions created in the solution, while only very limited part should be avaible for tenant to manage.

That is why we considered to deny tenants access to manage permissions but let them only manage some selected set or roles (which role configuration would remain on host level) but as far as we understand, assigning permissions to roles for particular tenants cannot be managed centrally on host level ? (could you please confirm) ?

So the scenario would be as follows: Host user can predefine and configure roles that could be used on the tenant level tenant user can assign a role to particular users but cannot see / edit granular permissions Or alternatively can we somehow filter the list of permissions available for tenant to configure to avoid confusion ?

Can this be done in the settings or does it need to be programmed? If coding, how do you approach it? Are there any tips?

Is it possible to prepare such a scenario and is it a good direction:

User logged as the host:

  • creates roles for Tenants,
  • assigns permissions to roles,
  • can see all roles for all tenants, edit, delete, etc.,

User logged within particular tenant:

  • can see only roles
  • (admin of tenant) can assign a user to roles (roles should work additively - if the user has 2 roles, it is enough some permission is granted only in one of them)

Hi, this link doesn't work:

When I try to add a new tenant I get message:

from log.txt description of this error:

ERROR 2024-03-05 13:50:41,970 [orker] Mvc.ExceptionHandling.AbpExceptionFilter - Setting value for 'Abp.Net.Mail.DefaultFromAddress' is null or empty! Abp.AbpException: Setting value for 'Abp.Net.Mail.DefaultFromAddress' is null or empty! at Abp.Net.Mail.EmailSenderConfiguration.GetNotEmptySettingValue(String name) at Abp.Net.Mail.EmailSenderConfiguration.get_DefaultFromAddress() at Abp.Net.Mail.EmailSenderBase.NormalizeMail(MailMessage mail) at Abp.Net.Mail.EmailSenderBase.SendAsync(MailMessage mail, Boolean normalize) at FlaskOne.Authorization.Users.UserEmailer.ReplaceBodyAndSendAsync(String emailAddress, String subject, StringBuilder emailTemplate, StringBuilder mailMessage) in D:\RW\PROGRAMING\PROJECTS\FLASK_ONE\SaaS\aspnet-core\src\FlaskOne.Core\Authorization\Users\UserEmailer.cs:line 486 at FlaskOne.Authorization.Users.UserEmailer.<>c__DisplayClass12_0.<<SendEmailActivationLinkAsync>b__0>d.MoveNext() in D:\RW\PROGRAMING\PROJECTS\FLASK_ONE\SaaS\aspnet-core\src\FlaskOne.Core\Authorization\Users\UserEmailer.cs:line 127 --- End of stack trace from previous location --- at Abp.Domain.Uow.UnitOfWorkManagerExtensions.WithUnitOfWorkAsync(IUnitOfWorkManager manager, Func1 action, UnitOfWorkOptions options) at FlaskOne.Authorization.Users.UserEmailer.SendEmailActivationLinkAsync(User user, String link, String plainPassword) in D:\RW\PROGRAMING\PROJECTS\FLASK_ONE\SaaS\aspnet-core\src\FlaskOne.Core\Authorization\Users\UserEmailer.cs:line 80 at FlaskOne.MultiTenancy.TenantManager.CreateWithAdminUserAsync(String tenancyName, String name, String adminPassword, String adminEmailAddress, String connectionString, Boolean isActive, Nullable1 editionId, Boolean shouldChangePasswordOnNextLogin, Boolean sendActivationEmail, Nullable1 subscriptionEndDate, Boolean isInTrialPeriod, String emailActivationLink, String adminName, String adminSurname) in D:\RW\PROGRAMING\PROJECTS\FLASK_ONE\SaaS\aspnet-core\src\FlaskOne.Core\MultiTenancy\TenantManager.cs:line 179 at FlaskOne.MultiTenancy.TenantRegistrationAppService.RegisterTenant(RegisterTenantInput input) in D:\RW\PROGRAMING\PROJECTS\FLASK_ONE\SaaS\aspnet-core\src\FlaskOne.Application\MultiTenancy\TenantRegistrationAppService.cs:line 101 at lambda_method2828(Closure, Object) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

That's true. I don't want to fill in this data because my company email account uses two stages of authentication: a password and the Microsoft Authenticator application and it doesn't work in this case either. If I use a private email account where I only have the password, creating a new tenant works fine.

I need one of two solutions.

  1. Switch off this functionality for now,
  2. be able to use your account with double authentication.

Is this solution a good solution when I have a few different menus? I need a completely different menu for one tenant than for another.

For example, one tenant has a menu:

  • Tasks
    • View
    • Calculations

but the second tenant one has:

  • Project
    • Management
    • Generator

e.t.c.

In my case, it does not depend on editions.

I quote info from https://aspnetboilerplate.com/Pages/Documents/Feature-Management Most SaaS (multi-tenant) applications have editions (packages) that have different features. This way, they can provide different price and feature options to their tenants (customers).

Is this a good method to create different home menus for different tenants without using the rules and permissions? Now I use my class in angular XXXNavigationService and run it in getMenu from AppNavigationService. How to do it correctly.

Thanks, for your help, you're right I forgot.

Hi My version is 11.4.0 , .net core, and angular.

I have a problem with adding one class to serve DynamicEntityProperty to one class in UI. My class AppDynamicEntityPropertyDefinitionProvider looks like this:

public override void SetDynamicEntityProperties(IDynamicEntityPropertyDefinitionContext context) { context.Manager.AddAllowedInputType<SingleLineStringInputType>(); context.Manager.AddAllowedInputType<ComboboxInputType>(); context.Manager.AddAllowedInputType<CheckboxInputType>(); context.Manager.AddAllowedInputType<MultiSelectComboboxInputType>(); //Add entities here context.Manager.AddEntity<User, long>(); context.Manager.AddEntity<FlaskTask,long>(); context.Manager.AddEntity<FlaskCustomer,long>(); context.Manager.AddEntity<FlaskUserExt,long>();

If I added code to my angular project according to Dynamic Property System

and logged info about this.entityNamesHasDynamicProperty DynamicEntityPropertyManagerComponent in hasEntity like:

I see that result:

 hasEntity FlaskOne.Authorization.Users.User,FlaskOne.Flask.FlaskCustomers.Models.FlaskCustomer,FlaskOne.Flask.FlaskUsers.Models.FlaskUserExt

I don't see FlaskTask class.

Part of FlaskTaskComponent in Angular

in the backend code, the head of class looks like this:

result in UI is

but for other my class FlaskUserExt I see the:

what is wrong with my FlaskTask class that I don't see that menu ?

Answer

OK, thank you, I see that angular code is used recaptcha in 3 versions ( ReCaptchaV3Service ). I will have to do the service in version 2 myself.

Showing 1 to 10 of 18 entries