powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как происходит авторизация пользователя
14 сообщений из 14, страница 1 из 1
Как происходит авторизация пользователя
    #35424187
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, всем!
Есть сайт со встроенной авторизацией asp.net, в БД лежат таблички aspnetMembership и aspnetusers в которых хранятся пользователи. Пишу внешнюю утилиту (delphi) для административных нужд, дык вот хотелось бы узнать каким образом можно проверить пользователя который вводит логин+пароль на существование, на правильность ввода пароля и на входимость в некоторые роли. Хотелось бы сделать посредсвом sql сервера. Порылся в хранимых процедурах не нашел ничего нужного..

PS: сдается мне что валидация происходит посредство движка asp.net, как тогда авторизировать юзеров из вне?
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35424210
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да там по-млему всё очевидно - посмотрите схему БД которую использует сиквельный членский провайдер. По-моему, даже в MSDN описано где-то - лень просто искать сейчас. Ну, а в качестве пацанского интерпрайзного метода можно ещё было бы, например, слепить ASP.NET веб-сервис, который дёргает готового провайдера, а к нему уже из дельфи и т.п. обращатьсо.
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35424407
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный БадаДа там по-млему всё очевидно - посмотрите схему БД которую использует сиквельный членский провайдер.

Не совсем понял, где можно посмотреть эту схему БД?

Чорный Бада По-моему, даже в MSDN описано где-то - лень просто искать сейчас. Ну, а в качестве пацанского интерпрайзного метода можно ещё было бы, например, слепить ASP.NET веб-сервис, который дёргает готового провайдера, а к нему уже из дельфи и т.п. обращатьсо.

Хотелось бы напрямую без посредников валидировать юзера. Может гдето можно подсмотреть процедурку ValidateUser(string username, string password) ?
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35424432
Membership
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблицы aspnet_*** не это разве надо??

Код: plaintext
1.
2.
3.
4.
5.
Membership

public static bool ValidateUser(string username, string password)
{
    return Provider.ValidateUser(username, password);
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SqlMembershipProvider

public override bool ValidateUser(string username, string password)
{
    if ((SecUtility.ValidateParameter(ref username, true, true, true, 0x100) && SecUtility.ValidateParameter(ref password, true, true, false, 0x80)) && this.CheckPassword(username, password, true, true))
    {
        PerfCounters.IncrementCounter(AppPerfCounter.MEMBER_SUCCESS);
        WebBaseEvent.RaiseSystemEvent(null, 0xfa2, username);
        return true;
    }
    PerfCounters.IncrementCounter(AppPerfCounter.MEMBER_FAIL);
    WebBaseEvent.RaiseSystemEvent(null, 0xfa6, username);
    return false;
}
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35424463
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MembershipТаблицы aspnet_*** не это разве надо??

Код: plaintext
1.
2.
3.
4.
5.
Membership

public static bool ValidateUser(string username, string password)
{
    return Provider.ValidateUser(username, password);
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SqlMembershipProvider

public override bool ValidateUser(string username, string password)
{
    if ((SecUtility.ValidateParameter(ref username, true, true, true, 0x100) && SecUtility.ValidateParameter(ref password, true, true, false, 0x80)) && this.CheckPassword(username, password, true, true))
    {
        PerfCounters.IncrementCounter(AppPerfCounter.MEMBER_SUCCESS);
        WebBaseEvent.RaiseSystemEvent(null, 0xfa2, username);
        return true;
    }
    PerfCounters.IncrementCounter(AppPerfCounter.MEMBER_FAIL);
    WebBaseEvent.RaiseSystemEvent(null, 0xfa6, username);
    return false;
}


Да, кажется это то что нужно, но как это заюзать в например на C#.Net, не говоря уже о дельфях..
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35424485
Membership
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CrvikДа, кажется это то что нужно, но как это заюзать в например на C#.Net, не говоря уже о дельфях..
Если касательно C#, то использовать Membership.ValidateUser()?
Для ролей тоже есть свои классы: Roles.UserInRole(), вроде...
Как вариант, может свою хранимую написать, если с Delphi..
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35424752
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Membership CrvikДа, кажется это то что нужно, но как это заюзать в например на C#.Net, не говоря уже о дельфях..
Если касательно C#, то использовать Membership.ValidateUser()?
Для ролей тоже есть свои классы: Roles.UserInRole(), вроде...
Как вариант, может свою хранимую написать, если с Delphi..

Получается есть возможность использовать хранимую процедуру? Если так, то где можно подсмотреть такую процедуру, ведь в таблице asp_membership лежит хэш пароля и соль, как валидировать логин+пароль, при помощи sql?
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35425121
Membership
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо, процедура будет сравнивать уже полученный ею хеш с хешом в aspnet-таблице.. Такую-то процедуру легко написать.. Хеш можно получить с помощью того же, как это делает сам класс Membership....
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35425140
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MembershipВидимо, процедура будет сравнивать уже полученный ею хеш с хешом в aspnet-таблице.. Такую-то процедуру легко написать.. Хеш можно получить с помощью того же, как это делает сам класс Membership....

Ок, спасибо, попробую поискать. Если есть готовый кусок кода, киньте пжалуйста, а то у меня с мсдном не особо дружу =(
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35425203
Membership
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это исходник метода CreateUser(), которым создается новый пользователь, по крайней мере я так понял:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
    string str3;
    MembershipUser user;
    if (!SecUtility.ValidateParameter(ref password, true, true, false, 0x80))
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }
    string salt = base.GenerateSalt();
    string objValue = base.EncodePassword(password, (int) this._PasswordFormat, salt);
    if (objValue.Length > 0x80)
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }
    if (passwordAnswer != null)
    {
        passwordAnswer = passwordAnswer.Trim();
    }
    if (!string.IsNullOrEmpty(passwordAnswer))
    {
        if (passwordAnswer.Length > 0x80)
        {
            status = MembershipCreateStatus.InvalidAnswer;
            return null;
        }
        str3 = base.EncodePassword(passwordAnswer.ToLower(CultureInfo.InvariantCulture), (int) this._PasswordFormat, salt);
    }
    else
    {
        str3 = passwordAnswer;
    }
    if (!SecUtility.ValidateParameter(ref str3, this.RequiresQuestionAndAnswer, true, false, 0x80))
    {
        status = MembershipCreateStatus.InvalidAnswer;
        return null;
    }
    if (!SecUtility.ValidateParameter(ref username, true, true, true, 0x100))
    {
        status = MembershipCreateStatus.InvalidUserName;
        return null;
    }
    if (!SecUtility.ValidateParameter(ref email, this.RequiresUniqueEmail, this.RequiresUniqueEmail, false, 0x100))
    {
        status = MembershipCreateStatus.InvalidEmail;
        return null;
    }
    if (!SecUtility.ValidateParameter(ref passwordQuestion, this.RequiresQuestionAndAnswer, true, false, 0x100))
    {
        status = MembershipCreateStatus.InvalidQuestion;
        return null;
    }
    if ((providerUserKey != null) && !(providerUserKey is Guid))
    {
        status = MembershipCreateStatus.InvalidProviderUserKey;
        return null;
    }
    if (password.Length < this.MinRequiredPasswordLength)
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }
    int num =  0 ;
    for (int i =  0 ; i < password.Length; i++)
    {
        if (!char.IsLetterOrDigit(password, i))
        {
            num++;
        }
    }
    if (num < this.MinRequiredNonAlphanumericCharacters)
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }
    if ((this.PasswordStrengthRegularExpression.Length >  0 ) && !Regex.IsMatch(password, this.PasswordStrengthRegularExpression))
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }
    ValidatePasswordEventArgs e = new ValidatePasswordEventArgs(username, password, true);
    this.OnValidatingPassword(e);
    if (e.Cancel)
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }
    try
    {
        SqlConnectionHolder connection = null;
        try
        {
            connection = SqlConnectionHelper.GetConnection(this._sqlConnectionString, true);
            this.CheckSchemaVersion(connection.Connection);
            DateTime time = this.RoundToSeconds(DateTime.UtcNow);
            SqlCommand command = new SqlCommand("dbo.aspnet_Membership_CreateUser", connection.Connection);
            command.CommandTimeout = this.CommandTimeout;
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add(this.CreateInputParam("@ApplicationName", SqlDbType.NVarChar, this.ApplicationName));
            command.Parameters.Add(this.CreateInputParam("@UserName", SqlDbType.NVarChar, username));
            command.Parameters.Add(this.CreateInputParam("@Password", SqlDbType.NVarChar, objValue));
            command.Parameters.Add(this.CreateInputParam("@PasswordSalt", SqlDbType.NVarChar, salt));
            command.Parameters.Add(this.CreateInputParam("@Email", SqlDbType.NVarChar, email));
            command.Parameters.Add(this.CreateInputParam("@PasswordQuestion", SqlDbType.NVarChar, passwordQuestion));
            command.Parameters.Add(this.CreateInputParam("@PasswordAnswer", SqlDbType.NVarChar, str3));
            command.Parameters.Add(this.CreateInputParam("@IsApproved", SqlDbType.Bit, isApproved));
            command.Parameters.Add(this.CreateInputParam("@UniqueEmail", SqlDbType.Int, this.RequiresUniqueEmail ?  1  :  0 ));
            command.Parameters.Add(this.CreateInputParam("@PasswordFormat", SqlDbType.Int, (int) this.PasswordFormat));
            command.Parameters.Add(this.CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, time));
            SqlParameter parameter = this.CreateInputParam("@UserId", SqlDbType.UniqueIdentifier, providerUserKey);
            parameter.Direction = ParameterDirection.InputOutput;
            command.Parameters.Add(parameter);
            parameter = new SqlParameter("@ReturnValue", SqlDbType.Int);
            parameter.Direction = ParameterDirection.ReturnValue;
            command.Parameters.Add(parameter);
            command.ExecuteNonQuery();
            int num3 = (parameter.Value != null) ? ((int) parameter.Value) : - 1 ;
            if ((num3 <  0 ) || (num3 >  11 ))
            {
                num3 =  11 ;
            }
            status = (MembershipCreateStatus) num3;
            if (num3 !=  0 )
            {
                return null;
            }
            providerUserKey = new Guid(command.Parameters["@UserId"].Value.ToString());
            time = time.ToLocalTime();
            user = new MembershipUser(this.Name, username, providerUserKey, email, passwordQuestion, null, isApproved, false, time, time, time, time, new DateTime(0x6da,  1 ,  1 ));
        }
        finally
        {
            if (connection != null)
            {
                connection.Close();
                connection = null;
            }
        }
    }
    catch
    {
        throw;
    }
    return user;
}

Видимо нам нужно это:
string objValue = base.EncodePassword(password, (int) this._PasswordFormat, salt);
где objValue:
command.Parameters.Add(this.CreateInputParam("@Password", SqlDbType.NVarChar, objValue));
То есть тот самый хешированный пароль, если я ничего не путаю.

смотрим EncodePassword() в классе MembershipProvider:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
internal string EncodePassword(string pass, int passwordFormat, string salt)
{
    if (passwordFormat ==  0 )
    {
        return pass;
    }
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    byte[] inArray = null;
    Buffer.BlockCopy(src,  0 , dst,  0 , src.Length);
    Buffer.BlockCopy(bytes,  0 , dst, src.Length, bytes.Length);
    if (passwordFormat ==  1 )
    {
        HashAlgorithm algorithm = HashAlgorithm.Create(Membership.HashAlgorithmType);
        if ((algorithm == null) && Membership.IsHashAlgorithmFromMembershipConfig)
        {
            RuntimeConfig.GetAppConfig().Membership.ThrowHashAlgorithmException();
        }
        inArray = algorithm.ComputeHash(dst);
    }
    else
    {
        inArray = this.EncryptPassword(dst);
    }
    return Convert.ToBase64String(inArray);
}
И осталось попробовать класс HashAlgorithm..
Получиться или нет, я не знаю... это так, мои размышления.

У Вас ведь, получается, в Delphi будет хеш расчитываться?
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35425234
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Membership
Получиться или нет, я не знаю... это так, мои размышления.
У Вас ведь, получается, в Delphi будет хеш расчитываться?
Да я хотел на дельфях утилитку написать, но чую на С# удобней будет, сейчас попробую то что вы дали, может получиться..
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35425266
Membership
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CrvikДа я хотел на дельфях утилитку написать, но чую на С# удобней будет, сейчас попробую то что вы дали, может получиться..
Если есть возможность на C#, то, думаю, на нем лучше будет.. Если ведь на делфи, то Вам нужно просто знать алгоритм, которым шифрует C#.. Скорее всего это SHA1. Тогда заюзайте его в делфи..

Из MSDN:
Код: plaintext
1.
HashAlgorithm sha = new SHA1CryptoServiceProvider();
byte[] result = sha.ComputeHash(dataArray);

Поэтому, наверно, SHA1.
...
Рейтинг: 0 / 0
Как происходит авторизация пользователя
    #35425769
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Membership

Спасибо за помощь!
Пошел по простому пути, пишу на C# и заюзал
Код: plaintext
 Membership.ValidateUser(username, password);
Думаю будет работать!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как происходит авторизация пользователя
    #39016993
Conejo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подниму тему. Стоит задача - такая же как у автора темы, 1 в 1.

У нас в базе есть пользователи с разными типами паролей - у некоторых стоит PasswordFormat = 1, а у некоторых = 2.
С первым типом мы уже разобрались, научились получать хэш по паролю и соли. Там используется хэширование по алгоритму SHA1 и потом кодирование его через BASE64. Все работает.

Подскажите пожалуйста, что делать с PasswordFormat = 2? Какие преобразования используются в этом случае?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как происходит авторизация пользователя
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]