1

私のMVCプロジェクトには次のログイン方法があります

    public ActionResult Login(LoginModel model, string returnUrl)
    {


        if (ModelState.IsValid)
        {


            if (_authenticationRepository.Login(model.UserName, model.Password))
            {                    
                var authenticationTicket = new FormsAuthenticationTicket(1, model.UserName, DateTime.Now,
                                                                         DateTime.Now.AddMinutes(20),
                                                                         model.RememberMe, "", "/");

                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                                FormsAuthentication.Encrypt(authenticationTicket));
                Response.Cookies.Add(cookie);
                UserContext.CreateUserContext();
                return RedirectToLocal(returnUrl);
            }
        }

UserContext.cs これは、ユーザー/権限をセッションに保存します。

    public static void CreateUserContext()
    {
        BuildUserContext(HttpContext.Current.User);
    }

    private static void BuildUserContext(IPrincipal principalUser)
    {
        if (!principalUser.Identity.IsAuthenticated) return;

        var user = _userAccountsRepository.GetUserByUserName(principalUser.Identity.Name);

        if (user == null) return;

        var userContext = new UserContext { IsAuthenticated = true };

        var siteUser = Mapper.Map(user);

        userContext.SiteUser = siteUser;

        HttpContext.Current.Session["UserContext"] = userContext;
    }

IsAuthenticated はリダイレクト後にのみ true になることを認識しています。私の login() メソッド内で、principalUser.Identity.IsAuthenticated が true を返すようにすることは可能ですか?

または、ログイン方法ではない場合、ユーザーコンテキストを作成するのに適した場所は他にありますか?

私が達成しようとしているのは次のとおりです。

  1. ユーザーのログイン
  2. ログインが成功した場合は、ユーザーが特定のアクションにアクセスできるかどうかを確認するたびに再クエリする必要がないように、db にロール/権限をクエリしてセッションに保存します。
4

1 に答える 1

0

次のようなことができます。

ユーザーが初めてログインするときに、ユーザーの役割/権限の詳細を取得し、シリアル化してセッションに保存します。したがって、このセッションはメモリ内にあるため、ユーザーが操作に対する権限を持っているかどうかを確認するたびに、データベースにアクセスする代わりにメモリからこれを逆シリアル化します。

于 2012-11-08T10:23:20.500 に答える