如何针对ASP.NET成员数据库手动验证用户?

时间:2010-05-18 10:09:37

标签: asp.net security asp.net-membership

我想知道如何针对现有的asp.net会员数据库验证用户的凭证。简短的故事是我们希望提供单点登录。

所以我做的是直接连接到成员资格数据库并尝试对aspnet_Membership表运行SQL查询:

private bool CanLogin(string userName, string password)
{
  // Check DB to see if the credential is correct
  try
    {
      string passwordHash = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "SHA1");
      string sql = string.Format("select 1 from aspnet_Users a inner join aspnet_Membership b on a.UserId = b.UserId and a.applicationid = b.applicationid where a.username = '{0}' and b.password='{1}'", userName.ToLowerInvariant(), passwordHash);
      using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString))
      using (SqlCommand sqlCmd = new SqlCommand(sql, sqlConn))
      {
         sqlConn.Open();
         int count = sqlCmd.ExecuteNonQuery();
         return count == 1;
       }
    }
    catch (Exception ex)
    {
        return false;
    }    
 }

问题是密码值,有人知道密码是如何散列的吗?

3 个答案:

答案 0 :(得分:1)

如果你在同一个IIS服务器上有两个asp.net应用程序,你可以像这样做SSO。我问了这个问题并自己回答了。

here

将两个应用程序指向您的asp_membership数据库后,将以下内容放入Web配置的system.web部分

<authentication mode="Forms" />
<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="membership"
              applicationName="/"
              />
  </providers>
</membership>
<roleManager enabled="true" />

确保两者都具有相同的applicationname属性集。

我使用的是IIS 6,因此我将其配置为自动生成两个应用程序的计算机密钥。由于这两个应用程序都位于同一台机器上,因此密钥是相同的,这是使SSO工作的关键部分。设置IIS后,我的web.config

中添加了以下内容
<machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" />

这就是它的全部内容。完成后,我可以登录到app1,然后浏览到app2并保留我的安全凭据。

答案 1 :(得分:0)

  

问题是密码值,   有谁知道密码怎么样   是哈哈?

是的 - 你这样做!检查你的web.config文件,如下所示:

<membership defaultProvider="MembershipSqlProvider" 
userIsOnlineTimeWindow="15">
 <providers>
  <add name="MembershipSqlProvider" 
    type="System.Web.Security.SqlMembershipProvider, System.Web,
    Version=1.2.3400.0, Culture=neutral, 
    PublicKeyToken=b03f5f7f11d50a3a" 

    PasswordFormat="Hashed" />
 </providers>
</membership>

PasswordFormat正是您要找的。它可以具有以下三个值:

  • Clear
  • Encrypted
  • Hashed

并且,Microsoft将Hashed的默认值设置为PasswordFormat

答案 2 :(得分:0)

为什么不通过System.Web.Security.Membership.ValidateUser()自动检查?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>    
        <membership defaultProvider="MyMembershipProvider">
            <providers>
                <clear />
                <add name="MyMembershipProvider" type="MyApplication.MyMembershipProvider" connectionStringName="MyConnString" />
            </providers>
        </membership>
    </system.web>
</configuration>