How to reroute role based user after login

15 views Asked by At

I have an interesting problem. I have 3 separate MVCs in a same solution (named: Public_Module, Admin_Module and Reg_Users_Module) that consume API by mapping DTOs in each MVC project. After a successful login, I try to reroute a user based on a role (Admin, RegisteredUser) to their respective Index page. Here are the MVCs controllers:

namespace Reg_Users_Module.Controllers
{  public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

namespace Admin_Module.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
        public IActionResult Index()
        {
           return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

namespace Public_Module.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IAuthorizeService _authorizeService;
        private readonly IMapper _mapper;

        public HomeController(ILogger<HomeController> logger, IAuthorizeService authorizeService, IMapper mapper)
        {
            _logger = logger;
            _authorizeService = authorizeService;
            _mapper = mapper;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }
 [HttpPost]
        public async Task<IActionResult> Login(UserLoginModel model)
        {
            if (ModelState.IsValid)
            {
                var loginResult = await _authorizeService.LoginAsync(new LoginDTO
                {
                    UserName = model.UserName,
                    Password = model.Password
                });

                if (loginResult.IsSuccess)
                {
                    var roles = await _authorizeService.GetUserRolesAsync(model.UserName);
                    var redirectPath = GetRedirectPathForRoles(roles);
                    return Redirect(redirectPath);
                }

                ModelState.AddModelError(string.Empty, loginResult.Message);
            }

            return View(model);
        }

        private string GetRedirectPathForRoles(IEnumerable<string> roles)
        {
            if (roles.Contains(StaticUserRoles.ADMIN))
            {
                return "/Admin_Module/Home/Index";
            }
            else if (roles.Contains(StaticUserRoles.USER))
            {
                return "/Reg_Users_Module/Home/Index";
            }
            else
            {
                return "/Home/Register";
            }
        }

As you can see, Public_Module is a startup MVC, and it should after login reroute user according to role, to either Admin_Module or Reg_Users_Module Index page. Here are routings in Program.cs classes:

// Reg_Users_Module:
app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

// Admin_Module:
app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

//Public_Module:
app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "admin",
    pattern: "Admin_Module/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "reg_users",
    pattern: "Reg_Users_Module/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

At the end, when I run it, I get ambiguous match exception


Reg_Users_Module.Controllers.HomeController.Index (Reg_Users_Module)
Public_Module.Controllers.HomeController.Index (Public_Module)
Admin_Module.Controllers.HomeController.Index (Admin_Module).```

Can anyone please tell me how to correctly setup this rerouting? Thanks!
0

There are 0 answers