Почему файл cookie ASP.NET FormsAuthentication не аутентифицирует пользователя? - PullRequest
3 голосов
/ 17 сентября 2011

У меня есть сайт, который использует 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 Ответ

4 голосов
/ 19 сентября 2011

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

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

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

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

...