Членство в ASP.NET - получение пароля и пароля из таблицы членства - хэш идентификатора пользователя - PullRequest
4 голосов
/ 30 апреля 2010

Я так близко, чтобы закончить этот проект. Мне нужно получить пароль и парольSalt из моей таблицы участников, чтобы сравнить ее с моей таблицей OldPasswords.

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

И я не могу получить его в обычном sqlConnection, потому что также хэшируется идентификатор пользователя.

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

Или, может быть, есть другой способ получить эти данные?

Любая помощь приветствуется.

Спасибо,

Steve

Ответы [ 2 ]

7 голосов
/ 30 апреля 2010

Стив, идентификатор пользователя не хэширован. Возможно, вы путаете UserName с UserId (ProviderUserKey), который является Guid.

В контексте ваших других вопросов: вы должны ссылаться на этот код как в коде, который вы используете для создания нового пользователя, чтобы зарегистрировать хэш, соль и формат начального пароля И в OnPasswordChanging, чтобы вы могли проверить отклонить / вставки.

Получит соответствующую информацию для текущего пользователя:

var user = Membership.GetUser();
var userId = user.ProviderUserKey;

MembershipPasswordFormat passwordFormat;
string passwordSalt;
string password;

var cstring = WebConfigurationManager.ConnectionStrings["localSqlServer"];
using (var conn = new SqlConnection(cstring.ConnectionString))
{
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "select PasswordFormat,PasswordSalt,Password from aspnet_Membership where UserId=@UserId";
        cmd.Parameters.AddWithValue("@UserId", userId);
        conn.Open();
        using (var rdr = cmd.ExecuteReader())
        {
            if (rdr != null && rdr.Read())
            {
                passwordFormat = (MembershipPasswordFormat) rdr.GetInt32(0);
                passwordSalt = rdr.GetString(1);
                password = rdr.GetString(2);
            }
            else
            {
                throw new Exception("An unhandled exception of type 'DoesntWorkException' has occured");
            }
        }
    }
}

//do something interesting hew with passwordFormat, passwordSalt , password 
3 голосов
/ 30 апреля 2010

Кажется, здесь происходит несколько разных вещей ...

  • Вы не можете восстановить хешированный пароль. Период. Цель хеширования состоит в том, чтобы предотвратить именно этот тип восстановления.

  • Вы можете хешировать идентификатор пользователя для поиска, если по какой-то причине значение идентификатора пользователя уже хэшировано в базе данных (хотя это немного странно, но нет веской причины хешировать идентификатор пользователя). Но вам нужно знать как это было хешировано. Если это MD5 или SHA1, самый быстрый способ - использовать FormsAuthentication.HashPasswordForStoringInConfigFile (но использовать его в имени пользователя вместо пароля).

  • Соль должна определенно не хэшироваться, в противном случае ее нельзя использовать. Соли добавляются к открытому текстовому паролю до хеширования, поэтому любое значение, которое вы видите в столбце соли , равно соли.

...