Аутентификация через web.config не аутентифицируется в ASP.net 3.5 - PullRequest
12 голосов
/ 17 июля 2009

Это одна из вещей, которая должна быть чрезвычайно простой, и я просто не могу понять, почему она не работает.

Я пытаюсь настроить очень быструю аутентификацию для приложения 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. И я не могу понять, почему.

Я даже пытался использовать Membership.ValidateUser, но он просто добавляет локальную базу данных в папку App_Data.

Есть что-то действительно простое, что я здесь забыл, или это не работает вообще в .net 3.5?

Ответы [ 5 ]

13 голосов
/ 17 июля 2009

Я не уверен, изменилось ли это в .NET 3.5, но элемент <credentials> имеет атрибут passwordFormat, который определяет формат паролей в web.config. Из документации MSDN для .NET 3.5 формат по умолчанию - SHA1.

Если вы используете имена пользователей и пароли в открытом тексте в web.config, вы должны использовать:

...
<credentials passwordFormat="Clear">
...

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

2 голосов
/ 03 сентября 2009

Еще одна возможная ошибка: имя пользователя «Администратор» выглядит особенным и не учитывается, если вы проверяете набор учетных данных в 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>

Проблема, похоже, не применяетсяВаш случай, но я потратил час на то, чтобы понять это, поэтому подумал, что запишу это здесь.

2 голосов
/ 17 июля 2009

Вы должны указать <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>
2 голосов
/ 17 июля 2009

Я думаю, что причина в том, что вы не указали формат пароля. http://msdn.microsoft.com/en-us/library/e01fc50a.aspx

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

0 голосов
/ 22 октября 2009

я нахожу это решение ........ сначала вы должны получить хеш-значение, используя FormsAuthentication.HashPasswordForStoringInConfigFile ("abc", "SHA1") в текстовом поле, запустив вашу программу, а затем укажите это значение в

...