0

我想驗證基於User.Identity.Name用戶,並從SQL Server數據庫樣作用和最後的loggedIn日期等細節,等混合Windows身份驗證與SQL Server自定義身份驗證MVC3

登錄我後應該授權同一用戶進行後續調用而不觸及數據庫。

但是,我在初次登錄時點擊並加載用戶信息,並將其存儲在會話中。

這裏是我的SQL表

ApplicationUser

  • 用戶ID - >窗戶存放在這裏的身份名稱映射
  • 顯示名稱
  • 角色ID
  • LastLoginDate
  • IsActive

登錄控制器邏輯

public ActionResult Login() 
{ 
string userId = User.Identity.Name; 
    userId = userId.Substring(userId.IndexOf(@"\") + 1); 
    var key = "Roles." + userId; 
    var roles = HttpContext.Cache[key] 
    if (roles == null) 
    { 
     User user = AdminService.SelectUser(userId); 
     roles = new string[] { user.Role.RoleName }; 
     HttpContext.Cache.Add(key, roles, null, 
      DateTime.Now.AddMinutes(HttpContext.Session.Timeout), 
      Cache.NoSlidingExpiration); 

     HttpContext.User = Thread.CurrentPrincipal = new 
        GenericPrincipal(User.Identity, roles); 
     HttpContext.Session["LoggedInUser"] = user; 
    } 
} 

另外我有下面的代碼授權每個requestin MVC3

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
if (User.Identity.IsAuthenticated) 
{ 
    string userId = User.Identity.Name; 
    userId = userId.Substring(userId.IndexOf(@"\") + 1); 
    var key = "Roles." + userId; 
    var roles = HttpContext.Cache[key]; 
    if (roles != null) 
    { 
     HttpContext.Current.User = 
      Thread.CurrentPrincipal = 
       new GenericPrincipal(User.Identity, roles); 
    } 
} 
} 

用戶但我建議改變這種上面的邏輯,如我得到一個在訪問存儲在會話中的用戶對象時發生問題。我不知道爲什麼它是這樣的。

有沒有人有其他可能的代碼/邏輯做上述混合認證?

編輯:我在訪問HttpContext.Session得到錯誤[ 「與loggedInUser」]在某些其他控制器的方法。

回答

1

因爲我在訪問存儲在會話中的用戶對象時遇到問題。

您沒有在會話中存儲信息。您正在將其存儲在緩存中。那是你的問題。緩存是在您的應用程序的所有用戶之間共享的。因此,您可以使用HttpContext.Session而不是使用HttpContext.Cache

除了使用會話和緩存,您可以將此信息存儲在表單身份驗證cookie的UserData部分中,因爲我有illustrated in this post

+0

我更新了我的問題。我將會話中的用戶信息存儲在稍後訪問。但有時會發生錯誤。我的代碼有些不好。我不知道發生了什麼問題。我提到http://stackoverflow.com/questions/5947278/when-postauthenticaterequest-gets-執行你的舊回答,並試圖按照 –

+0

偉大的,這是我會推薦你​​的方法。 –

+0

這很好。但使用與Windows身份驗證相結合的Fo​​rmsAuthenticationTicket不會產生任何問題,我認爲。這樣對嗎? –

相關問題