2010-09-25 99 views
0

剛剛過去的3天,探索會員資格,iprincipal,身份和其他goodies ..但有些東西仍然不清楚。 爲什麼最好使用這個煽動的簡單的存儲會話中最小化登錄用戶對象?它可以保存角色,權限和其他自定義屬性。ASP.NET MVC內置成員vs會話

來實現同樣的事情asp.net表單身份驗證方式,我會做:

protected void Application_AuthenticateRequest() 
{ 
    HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName); 
    if (cookie == null) 
     return; 
    bool isPersistent; 
    int webuserid = GetUserId(cookie, out isPersistent); 

    //Lets see if the user exists 
    var webUserRepository = Kernel.Get<IWebUserRepository>(); 

    try 
    { 
     WebUser current = webUserRepository.GetById(webuserid); 

     //Refresh the cookie 
     var formsAuth = Kernel.Get<IFormsAuthService>(); 

     Response.Cookies.Add(formsAuth.GetAuthCookie(current, isPersistent)); 
     Context.User = current; 
    } 
    catch (Exception ex) 
    { 
     //TODO: Logging 
     RemoveAuthCookieAndRedirectToDefaultPage(); 
    } 
} 

private int GetUserId(HttpCookie cookie, out bool isPersistent) 
{ 
    try 
    { 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
     isPersistent = ticket.IsPersistent; 
     return int.Parse(ticket.UserData); 
    } 
    catch (Exception ex) 
    { 
     //TODO: Logging 

     RemoveAuthCookieAndRedirectToDefaultPage(); 
     isPersistent = false; 
     return -1; 
    } 
} 

所以我需要查詢數據庫上的每個驗證的請求,當使用會話我會做只有當用戶登錄時,我知道您可以將角色和其他用戶數據存儲在票據Cookie中,但我認爲它不安全,因爲攻擊者可以修改cookie內容,將其移動並更多。

所以,其他人同意?

回答

1

默認的InProc會話狀態不是持久的,只要您的應用程序池回收就會「消失」。

SqlStore會話是持久的,但您的數據庫服務器上有額外的負載。

餅乾是目前網站的最佳選擇,可能會長時間不會改變。 Cookie相對安全,只要您加密cookie內容,默認情況下.net會執行此操作,您應該可以。

注意:.Net中有一個關於其默認加密方法的重大安全缺陷,所以當我說安全時,我的意思是安全的,可能會再次。

http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx

+1

值得指出的有替代品以上也是如此,如果你快樂流浪因循守舊一點。 Mongo/Memcached對於這類事情可以很好地利用proc商店。 – Nik 2010-09-25 23:55:22

+0

謝謝,但考慮一下上面的場景,是否有必要在每次獲取用戶obj並將其分配給上下文的請求中繼續敲擊數據庫? – TomerMiz 2010-09-26 07:25:49

+0

嗨,有誰可以迴應? – TomerMiz 2010-09-26 21:12:55