通过web.config进行身份验证,不在ASP.net 3.5中进行身份验证

时间:2009-07-17 12:02:47

标签: asp.net authentication web-config forms-authentication authorization

这是其中一件应该非常简单的事情,我无法理解为什么它不起作用。

我正在尝试为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 个答案:

答案 0 :(得分:13)

我不确定.NET 3.5中是否已更改,但<credentials>元素有一个属性passwordFormat,用于定义web.config中密码的格式。从MSDN documentation for .NET 3.5开始,默认格式为SHA1。

如果您在web.config中使用明文用户名和密码,则应使用:

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

事件虽然这是一个内部应用程序,我仍然建议至少散列密码而不是以明文形式保留。

答案 1 :(得分:2)

我认为原因是因为你没有注明密码格式。 http://msdn.microsoft.com/en-us/library/e01fc50a.aspx

默认为SHA1,因此您的明文实际上未正确使用。

答案 2 :(得分:2)

以明文形式存储密码时,必须指定<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>

答案 3 :(得分:2)

另一个可能的缺陷是,如果您在web.config中测试凭据集,则用户名“Admin”似乎很特殊而且不受尊重

<credentials>
 <user name="Admin" password="somepassword" />  //Authentication always returns false for me
</credentials>

<credentials>
 <user name="MyName" password="somepassword" />  //Authentication works normally 
</credentials>

这个问题似乎并不适用于你的情况,但我只花了一个小时搞清楚,所以我想我会把它记录在这里。

答案 4 :(得分:-3)

我找到了解决方案........首先你必须通过运行你的程序在文本框中使用FormsAuthentication.HashPasswordForStoringInConfigFile(“abc”,“SHA1”)获得hashvalue,然后在