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!