3

現在、ASP.NET MVC 3を使用してサイトを開発していますが、Nhibernateを使用しています。以下に説明するように、カスタムMembershipProviderを作成しました。

私の質問は、ValidateUserメソッドのセッションでユーザー認証を記録し、GetUserで取得するときです。

私が気付いたところによると、ValidateUserでSessionを使用することはできませんが、ストレージはユーザーセッションごとではないため、Cacheを使用することは正しくありません。

私はどのように行いますか?

class MyMembershipProvider : MembershipProvider
{
    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        var membershipUser = MyMembershipUser)HttpContext.Current.Cache.Get(username);

        // Is not possible
        // var membershipUser = (MyMembershipUser) HttpContext.Current.Session[username];

        return membershipUser;
    }

    public override bool ValidateUser(string username, string password)
    {
        var usuario = UsuarioRepository.GetUsuarioAuthentication(username, password);

        if (usuario != null)
        {
            HttpContext.Current.Cache.Add(username, new MyMembershipUser(usuario.Id, usuario.Email), null,
                                          Cache.NoAbsoluteExpiration, FormsAuthentication.Timeout,
                                          CacheItemPriority.Default, null);

            // Is not possible 
            // HttpContext.Current.Session.Add(username, new MyMembershipUser(usuario.Id, usuario.Email));

            return true;
        }

        return false;
    }

}

4

4 に答える 4

5

フォーム認証でASP.NETメンバーシップを使用する場合、セッションはまったく関係しません。

ユーザーが正常に認証されたら、電話するだけです

FormsAuthentication.SetAuthCookie() 

そして、認証Cookieが自動的に作成されます。これをValidateUser()で呼び出すのではなく、ValidateUser()を呼び出すクライアントコードから呼び出します。

認証Cookieは、セッションCookieから完全に独立しています。

詳細については、MSDNのフォーム認証を参照してください。

認証されたユーザーのユーザーの詳細をキャッシュする場合も、メンバーシッププロバイダー自体ではなく、Membership.ValidateUser()を呼び出すクライアントコードで行う必要があります。メンバーシッププロバイダーのGetUser()とValidateUser()は、名前が示すとおりに実行する必要があり、他の副作用はありません。

于 2012-06-21T00:46:26.743 に答える
1

これら2つのメソッドの実装では、データベースにクエリを実行し、ユーザー名パスワードを返すMembershipUserか検証する必要があります。心配する必要はありませんHttpContext

実装の詳細がわからないので、UsuarioRepositoryいくつかのメソッドを作成しましたが、プロバイダーは大まかに次のようにコーディングする必要があります。

class MyMembershipProvider : MembershipProvider
{
    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        var usuario = UsuarioRepository.GetUserByUserName(username);
        return new MyMembershipUser(usuario.Id, usuario.Email);
    }

    public override bool ValidateUser(string username, string password)
    {
        return UsuarioRepository.ValidateUser(username, password);              
    }
}

このUsuarioRepository.GetUserByUserName(username)メソッドは、指定されたユーザー名のユーザーを返すだけUsuarioRepository.ValidateUser(username, password)ですが、パスワードが指定されたユーザー名に対して正しい場合はtrueを返す必要があります。リポジトリは、セッションの取得とクエリの実行を処理します。

次に、プロバイダーのパフォーマンスを向上させるために、NHibernateの組み込みのキャッシュ機能の一部を使用して、キャッシュUsuarioRepositoryを使用するようにメソッドを変更することにより、これらのクエリの結果を確実にキャッシュすることができます。その場合、これらのメソッドを複数回呼び出してもパフォーマンスに影響はありません。

于 2012-06-21T01:17:44.167 に答える
1

セッションからユーザーを取得したくありません。GetUserは、データベースからユーザーを取得するためのもので、入力されたMembershipUserオブジェクトを返します。

于 2012-06-21T00:36:22.683 に答える
1

ユーザーに関する情報の保存を見つけることに関心がありますか?

MVCを使用すると、いつでも電話をかけることができます

        User.Identity.Name

これにより、ユーザーの現在のユーザー名が提供されます。

@Sailleが前述したように、独自のカスタムメンバーシッププロバイダーを作成するときは、の作成MembershipUserと検証の基本についてのみ気にする必要があります。MembershipUser

基本を実行してプロバイダーを作成したら、Sessionユーザーが正常にログインしたときに情報を保存できます。

于 2012-06-21T01:26:24.473 に答える