UserInRole似乎在MVC 5项目中似乎不起作用

时间:2013-12-27 14:00:00

标签: asp.net-mvc identity asp.net-mvc-5

我有一个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");
}

2 个答案:

答案 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以获取参考资料