6

私はASP.NET MVC 2プロジェクトを開始しました。私は自動的に生成されたコードを構築しています。リダイレクトの前に新しくログインしたユーザーのプロファイルをロードする方法

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

FormsServiceタイプ FormsAuthenticationService(また、生成された)のコントローラの特性である
[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
     //... 

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(); 
    } 
} 

POST-ログオンのみ作用、ビジュアルWeb開発者2010 Expressは基本的に発生するため

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

HttpContextに新しくログインしたユーザーのプロファイルを読み込むと、次のリクエストの前に自分のプロファイルにプロパティ値を設定できますか?

答えて

6

機能の命名はカウンター直感的ですが、ProfileBase.Create(ユーザー名)が既存のユーザーのために、既存のプロファイルを読み込むかが存在しない場合は、新しいプロファイルを作成します。この記事を参照してください。

var profile = ProfileBase.Create(userName); 

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

+0

これは新しいプロファイルを作成し、既存のプロファイルをロードしません。 –

+0

いいえ、間違っていると思います。既存のプロファイルが読み込まれます。やってみて。 –

+1

"引数としてユーザー名を使用してProfileBase.Create()を呼び出すと、TableStorageに対してルックアップが実行され、実際にはそのユーザー名に関連付けられたデータが取得されることに気づくまでには時間がかかりました。私はLoad()またはGet()を期待しています。この質問への答えを見てください:http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –

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); 
    } 

UPDATE:

は、私は元の質問を誤解しました。匿名ユーザーの場合は、タイプProfileCommonのプロファイルを作成して保存する必要があります。

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

+0

ログインした後に「次の」ページが読み込まれたときに、プロファイルがセッションに読み込まれたと仮定しています。 –

+0

@ニック:この実装では、プロファイルは検証の直後に、リダイレクトの前にセッションにロードされます。 –

+0

これはちょっと疑問に思うかもしれませんが、新しくログインしたユーザーのプロファイル( 'ControllerContext.HttpContext.Profile')をどのようにロードしますか? –

関連する問題