2011-08-20 2 views
11

私はcreateuserwizardコントロールを使用しています。 CreatedUserイベントでは、ユーザーをロールに追加するためにこのコードを配置しました。FormsAuthentication.SetAuthCookieの動作

protected void RegisterUser_CreatedUser(object sender, EventArgs e) 
    { 
     FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */); 


     if (!Roles.IsUserInRole("Test")) 
     { 
      var User= Membership.GetUser(); 
      Roles.AddUserToRole(User.UserName, "Test"); 
     } 

     string continueUrl = RegisterUser.ContinueDestinationPageUrl; 

     if (String.IsNullOrEmpty(continueUrl)) 
     { 
      continueUrl = "~/"; 
     } 
     Response.Redirect(continueUrl); 
    } 

私はまたMembership.GetUser()がnull何FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */);手段とそれがために使用されますと理由を知りたいと思います。

+0

デフォルトのメンバーシッププロバイダは、ログインしたユーザーを確認するたびにCookieをチェックするのではなく、以前のリクエスト処理段階でチェックします。あなたが 'SetAuthCookie'と同じリクエストに対してnullを返していますが、次のリクエストでユーザーが表示されます。これは遅れていて、簡単な方法を探しています... – bambams

答えて

12

CreateUserWizardLoginCreatedUser="false"またはDisableCreatedUser="true"がありますか?

、ユーザーが現在ログインされていないため、これらの、すぐに記録されてからユーザーを防ぐため、そしてMembership.GetUser()がnullを返すことになります。

を使用すると、ユーザーはすぐにログインする場合は、設定どちらかCreateUserWizardにはLoginCreatedUser="true"DisableCreatedUser="false"の両方があります。それはあなたの現在のコードが動作する必要があります。

FormsAuthentication.SetAuthCookie()は、ユーザーのセッションを開始するためのブラウザクッキーを設定します。これは、ページがサーバーに投稿されるたびにユーザーをログインさせ続けるためです。 createPersistentCookieは、ブラウザを閉じたときに期限切れにならない永続的なクッキーを作成するので、ユーザはサイトに戻って自動的にログインすることができます。ユーザーがログインフォームの[Remember me]チェックボックスをオンにしたかどうかに基づいている必要があります。デフォルトではCreateUserWizardフォームでは利用できませんが、必要に応じてテンプレートにチェックボックスを追加することができます。

ユーザーを自動的にログインさせたくない場合は、コードからFormsAuthentication.SetAuthCookie()行を削除し、CreateUserWizardプロパティを適切に設定します。ユーザーがログインできるようにする前に承認する場合は、DisableCreatedUser="true"と設定します。これにより、IISマネージャの.Net UsersモジュールからユーザーIsApproved=trueを設定するか、ユーザーを承認するカスタムWebページを所有するまで、ユーザーはログインできなくなります。

あなたはまだ、ユーザーが作成されたときにそれらをログに記録することなく、適切な役割にユーザーを追加設定することができます。ユーザーを作成した後、あなたがそれらをすぐにログに記録する

if (!Roles.IsUserInRole(RegisterUser.UserName, "Test")) 
{ 
    Roles.AddUserToRole(RegisterUser.UserName, "Test"); 
} 
1

、正しい?その場合、asp.netで使用される認証Cookieを削除して、ユーザーが認証されているかどうかを判断します(許可されているものとは異なります)。 "false"は、永続的でないことを意味します(ログオンフォームの "Remember me?"オプションに相当)。

ユーザーがNULLの理由については、GetUserコールの直前にブレークポイントを置き、

+0

こんにちはJuan、http: //stackoverflow.com/questions/16302505/asp-net-authentication –

+0

私はそれがあった答えた。申し訳ありませんが最近私のメッセージをチェックしていません:-) –