Почему файл cookie ASP.NET FormsAuthentication не аутентифицирует пользователя?

У меня есть сайт, который использует SqlMembershipProvider по умолчанию и FormsAuthentication. Я могу использовать встроенные средства контроля входа и / или программно вызывать все методы для проверки подлинности пользователя и получения того же результата - пользователь проходит проверку подлинности и создается файл 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 просто не работает для проверки моей аутентификации. Я подтвердил это, удалив все мои куки и наблюдая, как они снова создаются с помощью 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>

Следует отметить, что я также добавил запись machineKey в мой файл web.config, основываясь на предложении из очень похожего вопроса (который не решил мою проблему). Также, для справки, указанное выше время ожидания =525599 на 1 минуту меньше, чем для моих постоянных файлов cookie.

1 ответ

Решение

Я нашел проблему:

Поскольку мне удалось создать простой рабочий тестовый проект с точно таким же исходным кодом, я решил, что проблема была в файле web.config.

Проходя через каждый раздел, я обнаружил в 'system.web / httpModules' раздел у меня был <clear/> элемент. Это убрало <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/> модуль, определенный в файле web.config машинного уровня. Добавление его обратно сразу же решило проблему.

Конечно, было бы неплохо получить сообщение об ошибке, когда я попытался использовать методы FormsAuthentication, и этот модуль даже не был загружен...

Другие вопросы по тегам