5

問題:使用表單身份驗證獲取當前用戶標識(不是名稱)?

我在玩弄表單身份驗證和我自己的自定義成員資格提供程序。

從我所看到的,我可以通過執行獲得當前FormsIdentity:

System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity) 
    System.Web.HttpContext.Current.User.Identity; 

,我可以得到當前的會員用戶這樣做:

 var UserFromDb = System.Web.Security.Membership.GetUser(); 

,然後我可以獲取用戶標識通過這樣做:

var MyUserId = UserFromDb.ProviderUserKey; 

我覺得有趣的是,當我調用Membership.GetUser(),那麼它在會員供應商中使用此方法

public override MembershipUser GetUser(string username, bool userIsOnline) 

查找數據庫中的用戶信息。
所以我想通的是,.NET框架在內部做

GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever); 

後者從基於用戶名的數據庫的用戶信息。 我發現這令人不安,首先是因爲它不利於性能,因此我不得不查找整個用戶來獲取用戶標識。

其次,很令人不安的是我必須查找userid,因爲那不是我所期望的。

第三,這是令人不安的,因爲用戶名可以在程序過程中改變,並且讓用戶不得不註銷並登錄來做到這一點是無稽之談。

現在,對我來說這個設計聽起來像是無稽之談。
但是再次,微軟也使用應用程序名稱,組名和用戶名作爲主鍵,這也確實沒有多大意義。

所以在這裏,我的問題:
是不是有一種方式來獲得用戶ID沒有數據庫查詢?

或者是整個會員供應商的想法是如此破碎的設計?

如果它太破碎了:
我看到FormsIdentity有一個名爲userdata的字符串屬性。 如果是這樣,我該如何使用ASP.NET來保存用戶ID?

+6

歡迎來到ASP.NET會員供應商;在這些提供商尋找高質量設計的例子可能證明,呃,令人沮喪。 – 2013-04-26 16:45:30

回答

2

是的,可以從here解決方法。
可以在Auth cookie-Ticket UserData中設置UserId。

public class UserData 
{ 
    public string FirstName { get; set; } 
    public UserData() 
    { 
     FirstName = "Unknown"; 
    } 
} // End Class UserData 



public void SignIn(string userName, bool createPersistentCookie) 
{ 
    if (String.IsNullOrEmpty(userName)) 
     throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName"); 

    UserData userData = new UserData(); 
    SetAuthCookie(userName, createPersistentCookie, userData); 
    //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
} 


public void SetAuthCookie(string userName, bool createPersistentCookie, UserData userData) 
{ 
    HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie); 
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
     ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration 
     ,ticket.IsPersistent, userData.ToJSON(), ticket.CookiePath 
    ); 

    string encTicket = FormsAuthentication.Encrypt(newTicket); 
    cookie.Value = encTicket; 
    System.Web.HttpContext.Current.Response.Cookies.Add(cookie); 
} // End Sub SetAuthCookie 

另一種可能性是隻使用UserId.ToString()作爲「名稱」。

+3

但你如何檢索userData? – bflemi3 2014-06-26 20:23:22

相關問題