2014-03-13 110 views
0

我已經從可用的MVC4模板創建了一個Internet應用程序。此模板會生成我試圖使用的AccountController。問題是,即使WebSecurity.Login()返回true,User.Identity.IsAuthenticated仍然返回false,我不明白爲什麼。首先,我認爲這是通過AccountController初始化InitializeSimpleMembership屬性,因此,我將該部分移至Global.ascx.cs的Application_Start()例程,但它沒有任何區別。這是我正在使用的相關代碼。奇怪的MVC4身份驗證行爲 - User.Identity.IsAuthenticated在登錄後爲false

賬戶控制器

[HttpPost] 
public ActionResult Login(LoginModel model, string returnUrl) { 
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) { 

     //Why this should ever return false? 
     bool isAuthenticated = User.Identity.IsAuthenticated; 

     //returns false, even when I log in "Admin" role ! 
     if (User.IsInRole("Admin")) { 
      return RedirectToAction("Index", "Home", new { area = "Admin" }); 
     } 
     .... 
} 

Global.ascx.cs

public class MvcApplication : System.Web.HttpApplication { 
    protected void Application_Start() { 
     AreaRegistration.RegisterAllAreas(); 
     ... 
     // Ensure ASP.NET Simple Membership is initialized only once per app start 
     LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 

    } 

    private class SimpleMembershipInitializer { 
     public SimpleMembershipInitializer() { 
      ... 
     } 
    } 
} 

MSDN文檔here狀態,如果用戶登錄,則返回true。因此,在以上AccountController代碼中,User.Identity.IsAuthenticated應該始終返回True,但這不是偶然。它返回假。任何想法爲什麼?

編輯

我的首要問題是讓角色給定用戶,他已經成功地驗證後,即WebSecurity.Login()返回true後。

編輯2

Roles.IsUserInRole( 「管理」)返回false,甚至當我登錄 「管理員」 的角色

User.IsInRole( 「管理員」)在返回false即使日誌「管理員「角色。這已在原始帖子中發佈的代碼 中提及。當窗體身份驗證cookie被正確設定

回答

0

User.Identity.IsAuthenticated不會將您的登錄請求返回true,直到下一個請求FormsAuthentication.SetAuthCookie。看到http://msdn.microsoft.com/en-us/library/twk5762b.aspx

The SetAuthCookie method adds a forms-authentication ticket to either the cookies collection or the URL if CookiesSupported is false. The forms-authentication ticket supplies forms-authentication information to the next request made by the browser. With forms authentication, you can use the SetAuthCookie method when you want to authenticate a user but still retain control of the navigation with redirects.

如果你想看看如果登錄成功,使用WebSecurity.Login的返回值。請參閱http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.login(v=vs.111).aspx

要檢查用戶角色,請使用Roles.IsUserInRole()。請參閱http://msdn.microsoft.com/en-us/library/4z6b5d42(v=vs.110).aspx

+0

我的主要問題是檢查用戶是否屬於「管理員」角色或其他角色。在WebSecurity.Login()返回true之後應該用什麼來了解角色? – Jatin

+0

您可以使用WebSecurity.RequireRoles。請參閱http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.requireroles(v=vs.111).aspx – matthijsb

+0

我不認爲這會對我有幫助。我有2個MVC佈局頁面,一個用於普通用戶(角色=「用戶」),另一個用於管理員(角色=「管理員」)。當任何用戶登錄成功後,我必須確定用戶是屬於「admin」還是「user」角色,然後基於此,重定向到其各自的頁面。上面的WebSecurity.RequireRoles()不適合這裏,因爲它設置了我不想要的401(未授權)狀態碼。 – Jatin