2009-12-08 75 views
7

我有我已經鍵入到我的MVC項目帳戶控制器中的以下代碼,我在管理員和經理角色。當我登錄時,我被重定向回我的家庭索引,而不是被重定向到我的AdminApp索引。任何想法,我在我的代碼錯了?如何根據角色更改ASP.Net MVC登錄重定向?

​​

回答

19

您的代碼沒有按預期工作的原因是因爲User在技術上已經而不是已登錄並進行身份驗證。說什麼?但你確實打過SignIn!

FormsAuth.SignIn(userName, rememberMe); - 在這種情況下只是FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);的包裝 - 僅在用戶瀏覽器上設置asp.net授權cookie作爲響應的一部分。只有在之後請求這一點,用戶的瀏覽器纔會有cookie,導致asp.net成員資格正確設置'用戶'對象。 LogOn方法中的所有代碼仍然假設匿名用戶,因此您的IsInRole檢查失敗,並將您重定向到主頁。將你的if語句放在另一個頁面上,登錄後,你會看到現在User.IsInRole按預期工作。 (事實上​​,這是你在登錄過程中使用什麼User.IsInRole的,只是沒有)

因此,如何在實際的登錄過程檢查? Roles.IsUserInRoleRoles.GetRolesForUser是一對情侶的方式,例如:

if (Roles.IsUserInRole(userName, "Administrator") || Roles.IsUserInRole(userName, "Administrator")) 
{ 
    return RedirectToAction("Index", "AdminApp"); 
} 

您必須明確指定用戶身份登錄,將實際執行對會員數據存儲查詢的用戶名。在那個筆記上,我相信上面的代碼會導致兩個查詢被執行,你可能會發現不太理想。這是Roles.GetRolesForUser可能是更好的選擇:

string[] roles = Roles.GetRolesForUser(userName); 
if (roles.Contains("Administrator") || roles.Contains("Manager")) 
{ 
    return RedirectToAction("Index", "AdminApp"); 
} 

希望幫助!

+0

像一個魅力工作!我感謝幫助! – Ben 2009-12-19 00:06:12

+0

現在是3年半以後,但是..謝謝! – peter 2013-05-24 00:16:42

+0

哇!它仍然適用於** Asp.Net Core **。 – vivek 2017-10-16 10:23:35

0

您需要取消嵌套if語句。修改如下:

更改此:

FormsAuth.SignIn(userName, rememberMe); 
if (!String.IsNullOrEmpty(returnUrl)) 
{    
    return Redirect(returnUrl); 
}   
else 
{ 
    if (User.IsInRole("Administrator") || (User.IsInRole("Manager"))) 
    {    
     return RedirectToAction("Index", "AdminApp");  
    } 
    else   
    {     
    return RedirectToAction("Index", "Home"); 
    }  
} 

這樣:

if (User.IsInRole("Administrator") || (User.IsInRole("Manager"))) 
{    
    return RedirectToAction("Index", "AdminApp");  
} 
else   
{     
return RedirectToAction("Index", "Home"); 
}  

問題是行if(!String.IsNullOrEmpty(returnUrl)))被評估爲真,因爲RETURNURL參數有你的網頁的網址來自默認。

+0

哼。我嘗試過,並沒有爲我工作。我可以在一個aspx頁面上成功地使用User.InInRole來顯示/隱藏鏈接,但是當我把它放在一個控制器中時它不起作用。在控制器中是否有另外一種方法來執行此操作? – Ben 2009-12-08 17:54:31

+0

不應該有太大的區別,但是您可以嘗試使用Roles.IsUserInRole()。但是,我認爲這是最終被User.IsInRole()方法調用的方法。 – 2009-12-08 19:12:58

2

我使用VS 2013和它的新身份模型,我結束了這是怎麼回事:

foreach (IdentityUserRole identityUserRole in user.Roles) 
{ 
    if (identityUserRole.RoleId == "AdminRoleId") 
    { 
    return RedirectToAction("Index", "Admin"); 
    } 
    else if (identityUserRole.RoleId == "MemberRoleId") 
    { 
    return RedirectToAction("Index", "Members"); 
    } 
}