3

デフォルトの SqlMembershipProvider と FormsAuthentication を使用するサイトがあります。組み込みのログイン コントロールを使用したり、プログラムですべてのメソッドを呼び出してユーザーを認証したり、同じ結果を得ることができます。認証が必要なページに入らない。

デフォルトのログインコントロールは単に「機能する」はずなので、表示する実際のコードはありませんが、私が試したカスタムコードは次のとおりです。

protected void ctrlLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
   if (Membership.ValidateUser(ctrlLogin.UserName, ctrlLogin.Password))
   {
      FormsAuthentication.RedirectFromLoginPage(ctrlLogin.UserName, ctrlLogin.RememberMeSet);
      /*
       * I also tried this:
      FormsAuthentication.SetAuthCookie(ctrlLogin.UserName, ctrlLogin.RememberMeSet);
      if (!String.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
         Response.Redirect(Request.QueryString["ReturnUrl"]);
      Response.Redirect("/index.aspx");
       */
   }
   else
   {
      ctrlLogin.FailureText = "Invalid Username/Password Combination";
   }
}

このコードでは、Membership.ValidateUser() が成功し、 FormsAuthentication.RedirectFromLoginPage() と FormsAuthentication.RedirectFromLoginPage() の両方が Cookie を正常に設定しました。その Cookie は認証を検証するために機能しません。すべての Cookie を削除し、それらが FireCookie で再度作成されるのを確認して、これを確認しました。Cookie 名は web.config にあるものと一致し、ドメインは "/" で、有効期限は予想どおりです (以下を参照)。

私のweb.configの関連セクションは次のとおりです。

<authentication mode="Forms">
  <forms loginUrl="~/login/index.aspx" name=".SoeAuth" protection="All"
    slidingExpiration="true" timeout="525599" domain=""></forms>
</authentication>
<membership defaultProvider="SqlMembershipProvider">
  <providers>
    <add connectionStringName="[MY_CS]" applicationName="[MY_APPNAME]"
      minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0"
      enablePasswordReset="true" passwordFormat="Hashed" requiresUniqueEmail="true"
      name="SqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider"
      requiresQuestionAndAnswer="false"/>
  </providers>
</membership>

ここで非常によく似た質問からの提案に基づいて、web.configファイルにmachineKeyエントリも追加したことに注意してください(これは私の問題を解決しませんでした)。また、参考までに、上記の timeout=525599 は、永続的な Cookie の場合、1 年未満で 1 分です。

4

1 に答える 1

4

私は問題を見つけました:

まったく同じソース コードで簡単なテスト プロジェクトを作成できたので、問題は web.config ファイルにあると判断しました。

各セクションを見ていくうちに、その'system.web / httpModules'セクションに<clear/>要素があることがわかりました。これにより、<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>マシンレベルの web.config ファイルで定義されたモジュールが削除されました。それを再び追加すると、問題はすぐに修正されました。

FormsAuthentication メソッドを使用しようとして、そのモジュールがロードされていないときに、エラー メッセージが表示されたらよかったのに...

于 2011-09-19T15:08:19.303 に答える