为什么ASP.NET FormsAuthentication cookie不对用户进行身份验证?

时间:2011-09-16 20:49:14

标签: asp.net cookies membership formsauthentication

我有一个使用默认SqlMembershipProvider和FormsAuthentication的站点。我可以使用内置的Login Controls和/或以编程方式调用所有方法来验证用户并获得相同的结果 - 用户经过身份验证并创建了cookie,但cookie似乎无效,因为我可以'进入任何需要身份验证的页面。

没有真正的代码可以显示默认的登录控件,因为它应该只是“工作”,但这是我尝试的自定义代码:

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>

应该注意的是,我还根据a very similar question here的建议在我的web.config文件中添加了一个machineKey条目(这没有解决我的问题)。此外,作为参考,上面的超时= 525599比我的持久性cookie少一年1分钟。

1 个答案:

答案 0 :(得分:4)

我发现了问题:

由于我能够使用完全相同的源代码创建一个简单的工作测试项目,因此我确定问题出在web.config文件中。

通过每个部分,我在'system.web / httpModules'部分发现我有一个<clear/>元素。这删除了机器级web.config文件中定义的<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>模块。将其添加回来即刻修复问题。

当我尝试使用FormsAuthentication方法并且该模块甚至没有加载时,肯定会收到错误信息...