Как вручную проверить пользователя по базе данных членства ASP.NET? - PullRequest
2 голосов
/ 18 мая 2010

Я хотел бы знать, как я могу проверить учетные данные пользователя по существующей базе данных членства asp.net. Короче говоря, мы хотим предоставить единый знак доступа.

Итак, я подключился напрямую к базе данных участников и попытался выполнить SQL-запрос к таблице aspnet_Membership:

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 ]

1 голос
/ 18 мая 2010

если у вас есть два приложения asp.net на одном сервере IIS, вы можете сделать SSO следующим образом. Я задал этот вопрос и ответил на него сам.

здесь

После того, как оба приложения указывают на вашу базу данных asp_membership, поместите в раздел 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" />

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

Я использовал IIS 6, поэтому настроил его для автоматической генерации ключа компьютера для обоих приложений. Поскольку оба этих приложения находятся на одной и той же машине, ключ будет одинаковым, это критически важная часть работы единого входа. После настройки IIS в мой файл web.config

было добавлено следующее
<machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" />

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

0 голосов
/ 18 мая 2010

Почему бы не проверить это автоматически через 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>
0 голосов
/ 18 мая 2010

Проблема в значении пароля, Кто-нибудь знает, как пароль это хешируется?

Да, вы делаете! Проверьте файл 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.

...