0

CustomMembershipProviderを使用したログインのユースケースを次に示します。

  1. MembershipProviderのユーザーログはユーザーアカウントを検証します
  2. メンバーシップのユーザープロパティは、データベースからのユーザー詳細に設定されます
  3. 認証チケットが作成されます
  4. フォーム認証Cookieが追加されます。
  5. ユーザーがログインしています

これが私の問題のユースケースです

  1. Web開発サーバーを停止します
  2. Web開発サーバーを起動しても、ユーザーはまだログインしています(Cookieが原因ですか?)
  3. サーバーの再起動/障害により、ユーザープロパティのメンバーシップがnullに設定されている
  4. ユーザー値がnullであるため、アプリケーションが例外をスローする

私が考えることができる唯一の解決策は、Application_Start()ですべてのCookieをクリアすることですが、アプリケーションの開始時にRequestがコンテキスト外であるため、それがどのように可能であるかはわかりません。

このような問題を解決する方法はありますか?

コードは次のとおりです。

CustomMembershipProvider

public class CustomMembershipProvider : MembershipProvider
{
    #region Unimplemented MembershipProvider Methods
    //Other methods here
    #endregion

    //private IUserRepository _userRepository = new UserRepository();

    //Ninject bindings
    private IUserRepository _userRepository;

    [Inject]
    public IUserRepository UserRepository
    {
        set
        {
            _userRepository = value;
        }
    }

    private IProfileRepository _profileRepository;

    [Inject]
    public IProfileRepository ProfileRepository
    {
        set
        {
            _profileRepository = value;
        }
    }


    public User User
    {
        get;
        private set;
    }

    public Profile Profile
    {
        get;
        set;
    }


    public CustomMembershipProvider()
    {
        MvcApplication.Container.Inject(this);
    }

    public override bool ValidateUser(string username, string password)
    {
        if (string.IsNullOrEmpty(password.Trim())) return false;

        User user = _userRepository.GetUserByUsername(username);

        user.UserType = UserHelper.GetUserTypeById(user.UserTypeId);

        if (user == null) return false;

        string hash = PasswordHelper.ComputeHash(password, user.PasswordSalt);

        if (user.Password == hash)
        {
            this.User = user;

            Profile profile = _profileRepository.GetProfileByUserId(user.UserId);

            this.Profile = profile;
            return true;
        }

        return false;
    }
}

アカウントコントローラーのログイン方法は次のとおりです

        [HttpPost]
        public ActionResult Login(string username, string password)
        {

            if (!provider.ValidateUser(username, password))
            {
                TempData["LoginError"] = "Incorrect";
            }
            else
            {
                User user = provider.User;

                if (!user.Verified)
                {
                    TempData["LoginError"] = "Please verify your account";
                    return Redirect(Request.UrlReferrer.LocalPath);
                }

                //FormsAuthentication.SetAuthCookie(user.Username,false);
                FormsAuthenticationTicket authTicket = new
                               FormsAuthenticationTicket(1, //version
                               username,                    //user name
                               DateTime.Now,                //creation
                               DateTime.Now.AddMinutes(30), //Expiration
                               false,                       //Persistent
                               username);                   //since Classic logins don't have a "Friendly Name"

                string encTicket = FormsAuthentication.Encrypt(authTicket);
                Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

                WebsiteObjects.Profile profile = provider.Profile;


                TempData["LoginError"] = String.Empty;
            }


        return Redirect("/");

    }

ここでサーバーを再起動するときはいつでもそうなので、以下の提案は実行できません。

  1. Request.IsAuthenticatedはApplication_BeginRequestでFALSEです。
  2. Request.IsAuthenticatedは私の「ビュー」でTRUEです

なぜこうなった?

4

2 に答える 2

1

リクエストごとに手順2を実行するか、ユーザーの詳細を認証CookieのUserData部分に保存する必要があります。

于 2011-01-05T09:04:09.697 に答える
0

Application_AuthenticateRequestで、Request.IsAuthenticated = trueであるが、Userオブジェクトがnullであるかどうかを確認してから、再入力します。

于 2011-01-12T15:14:08.477 に答える