2015-08-27 70 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"); 
       }}