デフォルトの 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 分です。