我想驗證基於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」]在某些其他控制器的方法。
我更新了我的問題。我將會話中的用戶信息存儲在稍後訪問。但有時會發生錯誤。我的代碼有些不好。我不知道發生了什麼問題。我提到http://stackoverflow.com/questions/5947278/when-postauthenticaterequest-gets-執行你的舊回答,並試圖按照 –
偉大的,這是我會推薦你的方法。 –
這很好。但使用與Windows身份驗證相結合的FormsAuthenticationTicket不會產生任何問題,我認爲。這樣對嗎? –