Asp.net mvc UserInRole只是不';t似乎在MVC5项目中工作

Asp.net mvc UserInRole只是不';t似乎在MVC5项目中工作,asp.net-mvc,identity,asp.net-mvc-5,Asp.net Mvc,Identity,Asp.net Mvc 5,我有一个MVC5演示应用程序,我想让用户在登录时跳转到不同的菜单页面。我正在使用ASP.NET标识表,创建用户并将其置于角色中。我为每个AdminMenu和UserMenu创建了一个控制器,其中包含一个指向相应视图的索引操作 当我在Login post方法中放置断点时,我的代码会跳过UserInRoles部分,一直跳到return视图()的末尾,将我发送回登录页面。我使用rolesArray=Roles.GetRolesForUser()尝试了其他方法。我做错了什么 // POST: /Acco

我有一个MVC5演示应用程序,我想让用户在登录时跳转到不同的菜单页面。我正在使用ASP.NET标识表,创建用户并将其置于角色中。我为每个AdminMenu和UserMenu创建了一个控制器,其中包含一个指向相应视图的索引操作

当我在Login post方法中放置断点时,我的代码会跳过UserInRoles部分,一直跳到return视图()的末尾,将我发送回登录页面。我使用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");
}
//POST:/Account/Login
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务登录(LoginView模型,字符串返回URL){
if(ModelState.IsValid){
var user=await UserManager.FindAsync(model.UserName,model.Password);
如果(用户!=null){
等待符号同步(用户,model.RememberMe);
if(User.IsInRole(“Admin”)){
返回重定向到操作(“索引”、“管理菜单”);
}
if(User.IsInRole(“用户”)){
返回重定向到操作(“索引”、“用户菜单”);
}
}否则{
AddModelError(“,“无效的用户名或密码”);
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
//返回操作(“关于”、“家”);
}

这可能是您的问题:

return RedirectToAction("Index", "AdminMenu");
我猜调用的方法不是异步的

请参见参考

[HttpPost]
    [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);
    }
[异名] [ValidateAntiForgeryToken] 公共异步任务登录(LoginView模型,字符串返回URL) { if(ModelState.IsValid) { var user=await UserManager.FindAsync(model.UserName,model.Password); 如果(用户!=null) { 等待符号同步(用户,model.RememberMe); if(wait UserManager.IsInRoleAsync(user.Id.ToString(),“Admin”)) { 返回重定向到操作(“索引”、“管理菜单”); } if(wait UserManager.IsInRoleAsync(user.Id.ToString(),“user”)) { 返回重定向到操作(“索引”、“用户菜单”); } } 其他的 { AddModelError(“,“无效的用户名或密码”); } } //如果我们走到这一步,有些东西失败了,重新显示形式 返回视图(模型); }
跳过UserInRoles部分
,您是说前面的
返回都没有被调用吗?只是想澄清问题,没错。代码直接转到末尾的return View()。我在某个地方读到,您已经在web.config中启用了角色管理器。我也这么做了。仍然不走运。请尝试以下方法:在单步执行代码时,在if(User.IsInRole(“Admin”)
行停止。将鼠标悬停在“用户”上,查看相关的“角色”。告诉我你在那里看到了什么![仅供参考-我是通过内存来完成的,所以我假设您可以遍历到那里的角色。]抱歉,我在web.config中添加了一个。感谢雕像:上面写着:好的,我试过了,但我需要加上“等待”?我在等什么信号同步?公共异步任务索引(){return View();}我不知道异步/等待是如何工作的。我在这方面没有经验。我希望我能在这里提供帮助,但我不能。好吧,这是我放弃MVC的一个很好的理由。两个月来,我一直在努力学习它,并有一个很好的工作项目,但我一直遇到障碍。只是没有足够的代码基础和指导。我真的很抱歉。也许使用旧成员模型的webforms是最好的选择。这个项目是由于在2-3个月,我只是没有技能和知识的深度。与身份有关的工作经历非常令人沮丧。没有现成的东西(忘记密码、秘密问题等)。谁想重新创造这一切。对不起,你的咆哮。谢谢你的帮助。啊!!!不我来自ASP.NETWebForms。我再也不会回去了。如果您需要更集中的帮助,请给我发电子邮件。StachuKorick@gmail.com. 让我们谈谈。我不想看到有人去网络表单。恶心。@SKale:你是在用VS2013还是VS2012。我注意到,即使升级了VS2012的web工具以支持新的MVC5内容,您也无法获得标识之类的项目模板。但是,如果您在VS2013中启动了一个新的标识项目,它将为您构建身份验证、帐户创建、密码重置等所需的所有模型、控制器和视图!很高兴你找到了答案;这应该会在以后的某个时候派上用场!:)