Почему файл 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, и этот модуль даже не был загружен...