我有一个MVC 5演示应用程序,我希望用户在登录时被抛到不同的菜单页面。我正在使用ASP.NET身份表并创建用户并将其置于角色中。我为每个AdminMenu和UserMenu创建了一个控制器,其中一个Index操作指向相应的视图。
当我放置一个断点时,我在Login post方法中的代码跳过UserInRoles部分一直到返回View()一直到最后,将我发送回登录页面。我尝试使用rolesArray = Roles.GetRolesForUser()的其他方法。我做错了什么?
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) {
if (ModelState.IsValid) {
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null) {
await SignInAsync(user, model.RememberMe);
if (User.IsInRole("Admin")) {
return RedirectToAction("Index", "AdminMenu");
}
if (User.IsInRole("User")) {
return RedirectToAction("Index", "UserMenu");
}
} else {
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
//return RedirectToAction("About", "Home");
}
答案 0 :(得分:2)
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
if (await UserManager.IsInRoleAsync(user.Id.ToString(), "Admin"))
{
return RedirectToAction("Index", "AdminMenu");
}
if (await UserManager.IsInRoleAsync(user.Id.ToString(), "User"))
{
return RedirectToAction("Index", "UserMenu");
}
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
答案 1 :(得分:0)
这可能是你的问题:
return RedirectToAction("Index", "AdminMenu");
我的猜测是调用的方法不是异步的。
请参阅MVC4 .NET 4.5 async action method does not redirect以获取参考资料