这是其中一件应该非常简单的事情,我无法理解为什么它不起作用。
我正在尝试为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中根本不起作用?
答案 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,然后在中提供此值