2

私はMVCを初めて使用するので、この質問は些細なことかもしれません。LogOnアクションでは、次のことを行います。

public ActionResult LogOn(UserModel userModel, string returnUrl)
    {
        ActionResult retvalue = null;
        UserProfile user = MyDatabaseAccess.Instance.GetAuthenticatedUser(userModel.EmailAddress, userModel.Password);
        if (user != null)
        {
            FormsAuthentication.SetAuthCookie(userModel.EmailAddress, userModel.RememberMe);
            Session["LoggedOnUser"] = user;
            if (Url.IsLocalUrl(returnUrl))
            {
                retvalue = Redirect(returnUrl);
            }
            else
            {
                retvalue = RedirectToAction("Home", "Home");
            }
        }
        else
        {
            retvalue = RedirectToAction("LogOn", "Account");
        }
        return retvalue;
    }

この時点で、私のセッションには完全なUserProfileオブジェクトがあり、それをWebサイト全体で使用していますが、これまでのところ正常に機能しています。

次にユーザーがWebサイトにアクセスしたとき、ユーザーはすでに認証されており(remembermeはtrueに設定されています)、User.Identity.Nameには、以前に認証されたユーザーの電子メールアドレスが含まれています。これは正しいものです。問題は、LogOnアクションで行うのと同じ方法でUserProfileをセッションにロードしたいということです。すべての[承認済み]アクションではなく、それを実行する単一の場所が必要です。

そのような方法はありますか?

4

2 に答える 2

2

これを行う1つの方法は、ユーザー情報にアクセスするためのSecurityContextを作成することです。その後、SecurityContextをセッションに保持できます。ユーザーが認証されているが、SecurityContextがセッションに存在しない場合は、Dbからデータを読み取り、それをセッションに再度追加します。

おそらくこのようなもの:

public static class SecurityContext
{
    public static UserProfile CurrentUser
    {
        get
        {
            var user = HttpContext.Current.Session["CurrentUser"] as UserProfile;

            if (user == null)
            {
                using (var ctx = new YourDbContext())
                {
                    user = ctx.User.SingleOrDefault(u => u.UserName == 
                               HttpContext.Current.User.Identity.Name);
                    HttpContext.Current.Session["CurrentUser"] = user;
                }
            }

            return user;
        }
        set
        {
            HttpContext.Current.Session["CurrentUser"] = value;
        }
    }
}

アプリケーションの任意の時点で、次のコマンドを使用してユーザープロファイルにアクセスできます。SecurityContext.CurrentUser

もちろん[Authorized]、ユーザーが認証されていることを確認するには、コントローラー/アクションの属性を使用する必要があります。SecurityContextは、認証されたユーザーに関する情報に簡単にアクセスできるようにするための単なるラッパーです。

于 2012-10-23T20:22:32.460 に答える
1

これを行うためのより良い方法は、カスタムIIdentityおよび/またはIPrincipalを実装することです。頻繁に使用する情報を認証Cookieに保存します。情報が機密情報でない場合(つまり、ユーザー名を表示するために使用し、セキュリティ関連の情報には使用しない場合)、情報を独自のCookieに保存できます。

ここに良い記事があります:

http://www.bradygaster.com/custom-authentication-with-mvc-3.0

于 2012-10-23T20:32:33.550 に答える