SQL для создания пользователей .Net Membership Provider

У меня есть сценарий SQL, который создает пользователей в моей базе данных. Он использует хранимые процедуры членства в .Net.

На данный момент это работает нормально.

Единственная проблема заключается в том, что пароли сохраняются открытым текстом. Что здесь нужно изменить, чтобы они были солеными/зашифрованными (не знаю, какой термин использовать здесь)

GO

DECLARE @return_value int,
  @UserId uniqueidentifier


EXEC @return_value = [dbo].[aspnet_Membership_CreateUser]
  @ApplicationName = N'Theater',
  @UserName = N'sam.sosa',
  @Password = N'mypassword',
  @PasswordSalt = N'eyhKDP858wdrYHbBmFoQ6DXzFE1FB+RDP4ULrpoZXt6f',
  @Email = N'[email protected]',
  @PasswordQuestion = N'Whats your favorite color',
  @PasswordAnswer = N'Fusia',
  @IsApproved = 1,
  @CurrentTimeUtc = '2010-03-03',
  @CreateDate = '2010-03-03',
  @UniqueEmail = 1,
  @PasswordFormat = 0,
  @UserId = @UserId OUTPUT

SELECT @UserId as N'@UserId'

SELECT 'Return Value' = @return_value

GO

Спасибо!


person aron    schedule 26.06.2010    source источник
comment
Почему вы не используете членский API, а вместо этого запускаете SQL?   -  person František Žiačik    schedule 26.06.2010
comment
Мне нужно запустить инструкцию sql по причинам среды   -  person aron    schedule 26.06.2010
comment
Какую версию SQL вы используете? 2005, 2008 или R2?   -  person hwiechers    schedule 30.06.2010


Ответы (1)


Под капотом это выглядит как для режима хранения паролей "Хэшированный", он просто вычисляет:

SHA1 (соль + пароль)

Соль хранится в кодировке Base64, поэтому ее необходимо декодировать перед объединением с паролем (Unicode). Наконец, результатом является кодировка Base64 для хранения.

Следующий (ужасный) SQL выведет подходящее закодированное значение, которое можно заменить вместо «mypassword», которое у вас есть в настоящее время. Вы также должны установить для @PasswordFormat значение 1, чтобы указать, что пароль хранится в хешированном виде.

declare @salt nvarchar(128)
declare @password varbinary(256)
declare @input varbinary(512)
declare @hash varchar(64)

-- Change these values (@salt should be Base64 encoded)
set @salt = N'eyhKDP858wdrYHbBmFoQ6DXzFE1FB+RDP4ULrpoZXt6f'
set @password = convert(varbinary(256),N'mypassword')

set @input = hashbytes('sha1',cast('' as  xml).value('xs:base64Binary(sql:variable(''@salt''))','varbinary(256)') + @password)
set @hash = cast('' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable(''@input'')))','varchar(64)')

-- @hash now contains a suitable password hash
-- Now create the user using the value of @salt as the salt, and the value of @hash as the password (with the @PasswordFormat set to 1)

DECLARE @return_value int, 
  @UserId uniqueidentifier 

EXEC @return_value = [dbo].[aspnet_Membership_CreateUser] 
  @ApplicationName = N'Theater', 
  @UserName = N'sam.sosa', 
  @Password = @hash, 
  @PasswordSalt = @salt, 
  @Email = N'[email protected]', 
  @PasswordQuestion = N'Whats your favorite color', 
  @PasswordAnswer = N'Fusia', 
  @IsApproved = 1, 
  @CurrentTimeUtc = '2010-03-03', 
  @CreateDate = '2010-03-03', 
  @UniqueEmail = 1, 
  @PasswordFormat = 1, 
  @UserId = @UserId OUTPUT 

SELECT @UserId as N'@UserId' 

SELECT 'Return Value' = @return_value 
person Iridium    schedule 02.07.2010
comment
Иридиум, спасибо, но как включить это в оператор sql выше? - person aron; 02.07.2010
comment
Я изменил свой код, чтобы включить хеширование пароля в исходный SQL. - person Iridium; 02.07.2010
comment
Милая! Спасибо! работает хорошо! Боковое примечание: если пользователь позже изменит свой пароль, новый пароль также будет добавлен при просмотре в таблице tb_Memberships. - person aron; 02.07.2010
comment
Это здорово, но есть идеи, как что-то подобное можно сделать в SQL 2000? Да, знаю... - person Raelshark; 18.12.2010