2013-01-16 21 views
0

在我的應用程序當用戶登錄的時候我想存儲用戶的一些信息,比如我想要使用的名字,姓氏,ID,僱員ID等等放置在我的web應用程序中。 以前我使用窗體身份驗證如何將數據存儲在mvc中以便跨應用程序使用它

FormsAuthentication.SetAuthCookie(empDetails.Employee.EmployeeId, false); 

但它只存儲一個參數。我想存儲將在我的應用程序中使用的多個數據。

任何人都可以告訴我這樣做的最好方法。

+0

如果您知道是誰登錄,那麼您只需在數據庫中查看他們註冊時提供的其他詳細信息並將其存儲在會話/ cookie中即可? – RhysW

+0

是的,我可以但我不想在每次我想要相同的數據時查看數據庫。例如。我想在我的應用程序的許多地方(大約10-12個地方)的用戶FirstName,因爲每次我必須在數據庫中查詢以獲得Firstname,而不是這樣做,我想在用戶登錄和使用時存儲一些數據數據在哪裏。 –

回答

1

auth cookie可用於保存字符串。這個字符串可以編碼你想要的所有數據。 我通常會創建一個包含我想要保存的所有信息的對象(例如ConnectedUser類)。然後,我重寫該類的ToString()以返回一個字符串,我可以稍後解碼以重構ConnectedUser實例。如果所有模型都從單個基本模型繼承,那麼基礎模型可以具有ConnectedUser類型的屬性,那麼您甚至可以更容易,然後可以擴展DefaultModelBinder並覆蓋OnModelUpdated()以重建已連接用戶的實例。通常我通過接受requestcontext的方法來做到這一點,就像我可以從代碼中的其他地方調用它,如果modelbinder由於某種原因未被調用的話。

編輯

public class ConnectedUser{ 

     public string FirstName{get;set;} 
     public string LastName{get;set;} 
     public override string ToString(){ 
      return string.format("FirstName{0}{1}{2}LastName{0}{3}",EqualDelimiter, FirstName, EntryDelimiter, LastName); 
     } 
    } 

現在在驗證cookie的,而不是通過在userid的構造函數,你通過它ConnectedUser的實例,該名字和姓氏填寫。當接收到一個請求,您可以檢索用這2種方法可以從defaultModelBinder的自定義擴展或動作方法內部調用等

public static ConnectedUser GetConnectedUser(HttpContextBase executingContext) 
    { 
      var dictionary = GetAuthCookieData(executingContext); 
      var toRet = new ConnectedUser 
      { 
       FirstName = dictionary["FirstName"], 
       LastName= dictionary["LastName"] 
      } 
      return toRet; 
    } 
    public static IDictionary<string, string> GetAuthCookieData(HttpContextBase executingContext) 
    { 
     HttpCookie toCheck = executingContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     FormsAuthenticationTicket decrypted = FormsAuthentication.Decrypt(toCheck.Value); 
     string userData = decrypted.UserData; 
     return userData.ToDictionary<string, string>(); 
    } 

擴展defaultModelBinder應該直截了當連接的用戶只是不要忘了在全球進行註冊的.asax。網上有很多關於如何做到這一點的文章。

+0

你可以給我一些例子或參考。 –

0

你可以JSON字符串存儲與您想要的所有參數:

{name:"NAME",id:"IDENTIFIER",email:"EMAIL"} 

然後分析它的恢復。

1

對於您的問題,我會在HTTPCOntext.Current.Session

首先建議儲存你的價值然後在用戶登錄後創建這樣

public class CurrentCustomer 
    { 
      public string FirstName { get; set; } 
      public string LastName { get; set; } 
      public string Email { get; set; } 

      private string _Token; 
      public string Token 
      { 
       get 
       { 
        return _Token; 
       } 
       set 
       { 
        _Token = value; 
       } 
      } 
    } 

類(指當用戶被授權) 獲取所有您所需的數據填充您的CurrentCustomer對象,然後像這樣創建您的Seeion

HttpContext.Current.Session[CurrentCustomer] = CurrentCustomer; 

而現在你需要這個值創建你的CUrrentCUstomer對象。

CurrentCustomr obj = ((CurrentCustomer)HttpContext.Current.Session[CurrentCustomer]); 

這就是你需要的。

相關問題