5

質問:

フォーム認証と独自のカスタム メンバーシップ プロバイダーをいじっています。

私が見たところ、次のようにして現在の FormsIdentity を取得できます。

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

そして、これを行う現在のメンバーシップ ユーザーを取得できます。

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

そして、これを行うことでユーザーIDを取得できます:

var MyUserId = UserFromDb.ProviderUserKey;

私が面白いと思うのは、Membership.GetUser() を呼び出すと、メンバーシップ プロバイダーでこのメソッドが呼び出されることです。

public override MembershipUser GetUser(string username, bool userIsOnline)

データベースでユーザー情報を検索します。
だから私が考えたのは、.NETフレームワークが内部的に行うということです

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

USERNAME に基づいてデータベースからユーザー情報を取得します。まず、ユーザー ID を取得するためだけにユーザー全体を検索する必要がある場合、パフォーマンスが低下するため、これは気がかりです。

第二に、ユーザー ID をまったく検索しなければならないのは気がかりなことです。

第三に、ユーザー名はプログラムの過程で変更される可能性があり、ユーザーがログアウトしてログインしなければならないのはナンセンスです。

さて、私にはこのデザインはナンセンスに思えます。
しかし、マイクロソフトはアプリケーション名、グループ名、およびユーザー名も主キーとして使用しますが、これもあまり意味がありません。

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

それとも、メンバーシップ プロバイダーのアイデア全体が、設計上壊れているのでしょうか?

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

4

1 に答える 1

2

はい、ここからの回避策でできます。
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() を「名前」として使用することです。

于 2013-04-26T20:12:22.263 に答える