5

質問:フォーム認証を使用して現在のユーザーID(名前ではない)を取得していますか?

私はフォーム認証と自分のカスタムメンバーシッププロバイダーで遊んでいます。

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

をそして私はこれやって、現在のメンバーシップのユーザーを取得することができます:私が見たものから、

、私は実行して、現在のFormsIdentityを取得することができます

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

そして、私は、ユーザーIDを取得することができますが私はおかしい見つける何

var MyUserId = UserFromDb.ProviderUserKey; 

は)私がMembership.GetUser(呼び出すときということです、それは:これを行うことにより、メンバーシッププロバイダでこのメソッドを呼び出します。

public override MembershipUser GetUser(string username, bool userIsOnline) 

データベース内のユーザー情報を検索します。私は考え出しだから何
は、.NETフレームワークは、内部でUSERNAMEに基づいて、データベースからユーザー情報を取得します

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

をするということです。 私は、ユーザーIDを取得するだけで全ユーザーを検索しなければならないときにパフォーマンスが悪いため、まずこのことを気にしません。

第2に、それは私が期待していたものではないので、私はユーザーIDを全く検索しなければならないことに気をつけています。

第三に、プログラムの途中でユーザー名を変更することができないため、ユーザーがログアウトしてログインする必要があるため、気になるのです。

私にとって、このデザインはナンセンスのように聞こえます。
しかし、やはりマイクロソフトではアプリケーション名、グループ名、およびユーザー名をプライマリキーとして使用していますが、実際にはあまり意味がありません。

ここで私の質問:
DBルックアップなしでユーザーIDを取得する方法はありませんか?

メンバーシッププロバイダーのアイデア全体が設計によって壊れていますか?

壊れている場合:
私は、FormsIdentityにuserdataという文字列プロパティがあることがわかりました。 その場合、ASP.NETを使用してそこにユーザーIDを保存するにはどうすればよいですか?

+6

ASP.NETメンバーシッププロバイダへようこそ。これらのプロバイダで高品質のデザインの例を探していると、うんざりするかもしれません。 –

答えて

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 

もう1つの可能性は、UserId.ToString()を「名前」として使用することです。

+3

あなたはuserDataをどのように取得しますか? – bflemi3

関連する問題