【问题标题】:Authentication through web.config not authenticating in ASP.net 3.5通过 web.config 进行身份验证未在 ASP.net 3.5 中进行身份验证
【发布时间】:2010-11-11 16:28:48
【问题描述】:

这是一件应该非常简单的事情,我就是不知道为什么它不起作用。

我正在尝试为 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(username, password) 总是返回 false。我不知道为什么。

我什至尝试使用 Membership.ValidateUser 但这只是将本地数据库添加到 App_Data 文件夹中。

我是否在这里忘记了一些非常基本的东西,或者这在 .net 3.5 中根本不起作用?

【问题讨论】:

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


    【解决方案1】:

    我不确定这在 .NET 3.5 中是否发生了变化,但&lt;credentials&gt; 元素有一个属性passwordFormat,它定义了web.config 中的密码格式。从MSDN documentation for .NET 3.5开始,默认格式为SHA1。

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

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

    尽管这是一个内部应用程序,但我仍然建议至少对密码进行散列处理,而不是将其保留为明文。

    【讨论】:

    • 魔法,就是这样!当我读到那句话时,额头与手掌相得益彰。令人惊讶的是你在星期五下午忘记了。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      当您以明文形式存储密码时,您必须指定&lt;credentials passwordFormat="Clear"&gt;

      替代方案是使用 MD5 或 SHA1 的加密密码。

      请参阅http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile.aspx 了解密码编码功能。

      您也可以考虑使用一些可用的用户控件,这些控件可以自动为您做很多事情。查看 Visual Studio 控制工具箱中的“登录”部分。

      以下页面将提供此简单案例所需的一切,并且登录控件的外观是完全可定制的:

      <%@ 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】:

        另一个可能的陷阱是,如果您测试 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>
        

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

        【讨论】:

          【解决方案5】:

          我找到了那个解决方案........首先你必须通过运行你的程序在文本框中使用 FormsAuthentication.HashPasswordForStoringInConfigFile("abc","SHA1") 来获取哈希值,然后在

          【讨论】:

            猜你喜欢
            • 2015-09-23
            • 1970-01-01
            • 2017-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多