Аутентификация через web.config не аутентифицируется в ASP.net 3.5
Это одна из этих вещей, которая должна быть предельно простой, и я просто не могу понять, почему она не работает.
Я пытаюсь настроить очень быструю аутентификацию для приложения ASP.net 3.5, но сохраняя имена пользователей и пароли в файле web.config(я знаю, что это не очень безопасно, но это внутреннее приложение, которое меня постоянно спрашивает для добавления и удаления логинов, так что это самый быстрый способ сделать это).
Итак, соответствующий раздел конфигурации выглядит следующим образом:
<authentication mode="Forms">
<forms loginUrl="~/login.aspx">
<credentials>
<user name="user" password="password" />
<user name="user2" password="password2" />
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
И, на странице входа, код выглядит следующим образом:
string username = tbUsername.Text;
string password = tbPassword.Text;
if (FormsAuthentication.Authenticate(username, password))
FormsAuthentication.RedirectFromLoginPage(username, false);
Но, FormsAuthentication.Authenticate(имя пользователя, пароль) всегда возвращает false. И я не могу понять, почему.
Я даже пытался использовать Memberhip.ValidateUser, но это просто добавляет в локальную базу данных папку App_Data.
Есть ли что-то действительно основное, что я забыл здесь или это вообще не работает в .net 3.5?
Ответы
Ответ 1
Я не уверен, что это изменилось в .NET 3.5, но элемент <credentials>
имеет атрибут passwordFormat
, который определяет формат паролей в web.config
. Из документации MSDN для .NET 3.5 формат по умолчанию - SHA1.
Если вы используете пользовательские имена и пароли с открытым текстом в своем web.config
, вы должны использовать:
...
<credentials passwordFormat="Clear">
...
Событие, хотя это внутреннее приложение, я по-прежнему рекомендую по крайней мере хэшировать пароль, а не оставлять его в ясном тексте.
Ответ 2
Я думаю, причина в том, что вы не указали парольFormat.
http://msdn.microsoft.com/en-us/library/e01fc50a.aspx
По умолчанию используется SHA1, поэтому ваш чистый текст фактически не используется должным образом.
Ответ 3
Вы должны указать <credentials passwordFormat="Clear">
при сохранении пароля в открытом тексте.
Альтернативы - это зашифрованные пароли с использованием MD5 или SHA1.
См. http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile.aspx для функции для кодирования пароля.
Вы также можете рассмотреть возможность использования некоторых доступных пользовательских элементов управления, которые много делают для вас автоматически. Посмотрите раздел "Логин" в панели инструментов управления в Visual Studio.
Следующая страница предоставит все, что вам нужно для этого простого случая, а внешний вид элемента управления Login полностью настраивается:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
e.Authenticated = FormsAuthentication.Authenticate(Login1.UserName, Login1.Password);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Login</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Login ID="Login1" runat="server" onauthenticate="Login1_Authenticate">
</asp:Login>
</div>
</form>
</body>
</html>
Ответ 4
Еще одна возможная ошибка, заключающаяся в том, что имя пользователя "Admin" кажется особенным и не выполнено, если вы проверяете учетные данные, установленные в web.config
<credentials>
<user name="Admin" password="somepassword" /> //Authentication always returns false for me
</credentials>
<credentials>
<user name="MyName" password="somepassword" /> //Authentication works normally
</credentials>
Проблема, похоже, не применима в вашем случае, но я просто потратил час на то, чтобы понять это, поэтому я решил записать ее здесь.
Ответ 5
Я нахожу это решение........ сначала вам нужно получить hashvalue, используя FormsAuthentication.HashPasswordForStoringInConfigFile( "abc", "SHA1" ) в текстовом поле, запустив вашу программу, а затем укажите это значение в