2015-08-27 39 views
2

我使用由ASP.NET MVC生成的默认Login方法,并且想要将其更改为基于用户角色重定向到指定View。我已检查过该用户是否在该角色中。我在SignInStatus成功块内重定向,但没有成功。基于角色的ASP.NET MVC登录和重定向

我在其他代码块中使用User.IsInRole(),并且正常工作。我认为执行if语句时用户没有完全登录。我认为是这样,但我不确定我可以实施什么解决方案。

这是我的代码如下。

 // POST: /Account/Login 
     [HttpPost] 
     [AllowAnonymous] 
     [ValidateCustomAntiForgeryTokenAttribute] 
     public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
     { 
      if (!ModelState.IsValid) 
      { 
       return View(model); 
      } 

      // This doesn't count login failures towards account lockout 
      // To enable password failures to trigger account lockout, change to shouldLockout: true 
      var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
      switch (result) 
      { 
       case SignInStatus.Success: 
        if (User.IsInRole("Customer")) 
        { 
         return RedirectToAction("Customer", "Home"); 
        } 
        else if (User.IsInRole("Requestor")) 
        { 
         return RedirectToAction("Caterer", "Home"); 
        } 
        else if (User.IsInRole("Admin")) 
        { 
         return RedirectToAction("Admin", "Home"); 
        } 
        else 
        { 
         return RedirectToLocal(returnUrl); 
        } 
       case SignInStatus.LockedOut: 
        return View("Lockout"); 
       case SignInStatus.RequiresVerification: 
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
       case SignInStatus.Failure: 
       default: 
        ModelState.AddModelError("", "Invalid login attempt."); 
        return View(model); 
      } 
     } 
+1

可能相关:HTTP://计算器.com/questions/26273598/why-does-isinrole-always-return-false –

+0

伟大的链接为我工作。 –

回答

3

感谢@ stephen.vakil的链接,我设法通过更改SignInStatus.Success案例中的代码块来实现它。

  case SignInStatus.Success: 
       var user = await UserManager.FindAsync(model.Email, model.Password); 
       var roles = await UserManager.GetRolesAsync(user.Id); 

       if (roles.Contains("Customer")) 
       { 
        return RedirectToAction("Customer", "Home"); 
       } 
       else if (roles.Contains("Requestor")) 
       { 
        return RedirectToAction("Caterer", "Home"); 
       } 
       else if (roles.Contains("Admin")) 
       { 
        return RedirectToAction("Admin", "Home"); 
       } 
       else 
       { 
        return RedirectToLocal(returnUrl); 
       } 
       ...... 
2

你是对的。您在此处引用的用户对象通过ASP.NET管道中的“身份验证”步骤进行设置。欲了解更多信息,请查看Lifecycle of an ASP.NET 5 Application

PasswordSignInAsync只验证您的用户并为将来的请求设置身份验证Cookie。它不会影响User对象,该对象仍将表示通过管道馈送的未经身份验证的状态。

一个简单的方法来实现你想要的是让你的登录方法重定向到另一个动作(类似RedirectUser),然后执行基于角色的路由。此方法将完全访问经过身份验证的用户对象和方法。

或者,你可以实现你自己的User.IsInRole方法,直接查询你的数据库。

+0

感谢您的资源,清理了一些东西。 –

0

如果你想asp.net身份的用户默认登录,那么你应该得到的成功结果后的角色是这样,然后重定向会解决这个问题

 var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 

       var userId = SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.GetUserId(); 
       if (UserManager.IsInRole(userId, "Super Admin")) 
       { 
        return RedirectToAction("Index", "DashBoard"); 
       }}