6

ASP.NET MVC 2プロジェクトを開始し、自動的に生成されたコードから構築しています。

私が経験している問題は、ユーザーがログインした後、新しくログインしたユーザーのプロファイルがにロードされていないHttpContextように見えるため、ProviderException「このプロパティは匿名ユーザーには設定できません」というメッセージが表示されることです。 "現在のユーザーのプロファイルにプロパティ値を設定しようとしたとき。

POSTのみのログオンアクションの場合、Visual Web Developer2010Expressは基本的に以下を生成します。

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ValidateUser(model.UserName, model.Password))
            {
                FormsService.SignIn(model.UserName, model.RememberMe);
        //...

ここFormsServiceで、はタイプのコントローラーのプロパティですFormsAuthenticationService(これも生成されます):

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}

行の後FormsService.SignIn(model.UserName, model.RememberMe)で、新しくログインしたアカウントの情報がコントローラーですぐに利用できると想定していましたが、そうではないようです。たとえば、profile.SetPropertyValue("MyProfileProperty", "test")FormsService#SignInの呼び出しの下に追加すると、ProviderException「このプロパティは匿名ユーザーには設定できません」というメッセージが表示されます。

HttpContext新しくログインしたユーザーのプロファイルをにロードして、次のリクエストの前にそのユーザーのプロファイルにプロパティ値を設定できるようにするにはどうすればよいですか?

4

2 に答える 2

7

関数の命名は直感に反しますが、ProfileBase.Create(username)は、既存のユーザーの既存のプロファイルをロードするか、存在しない場合は新しいプロファイルを作成します。

var profile = ProfileBase.Create(userName);

これはプロファイルをにロードしませんControllerContext.HttpContext.Profileが、少なくともユーザープロファイルにアクセスまたは変更することができます。

于 2011-01-19T16:08:21.627 に答える
1

MVCテンプレートに組み込まれている「生の」フォーム認証は、プロファイルを自動的にロードしません。メンバーシップテーブルに対してユーザーを検証し、ログインCookieを設定するだけです。ログイン時にプロファイルデータをセッション状態で保持する場合は、明示的に行う必要があります。

[HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ValidateUser(model.UserName, model.Password))
            {
                FormsService.SignIn(model.UserName, model.RememberMe);
                LoadProfile(model.UserName);
            }
     }

     private void LoadProfile(string UserName)
     {
          MyModelContext ctx = new MyModelContext(); //EF or LINQ2SQL context
          var user = ctx.Users.Where(u => u.UserName == UserName).FirstOrDefault();
          Session.Add("CurrentUser", user);
     }

アップデート:

私は元の質問を誤解しました。ProfileCommon匿名ユーザー用のタイプのプロファイルを作成して保存する必要があります。この投稿を参照してください:

http://forums.asp.net/p/1150958/2619264.aspx

于 2011-01-19T15:56:33.227 に答える