【发布时间】:2012-02-09 21:46:22
【问题描述】:
我创建了一堆插入脚本来将新用户添加到 aspnet_Membership 和 aspnet_User 表中。我无法验证,说它找不到我的用户。
有没有人尝试通过 T-SQL 插入创建新的会员用户?我必须这样做,因为我们在 C#/ASP.NET 中创建用户代码目前不起作用。
【问题讨论】:
标签: asp.net tsql asp.net-membership membership-provider
我创建了一堆插入脚本来将新用户添加到 aspnet_Membership 和 aspnet_User 表中。我无法验证,说它找不到我的用户。
有没有人尝试通过 T-SQL 插入创建新的会员用户?我必须这样做,因为我们在 C#/ASP.NET 中创建用户代码目前不起作用。
【问题讨论】:
标签: asp.net tsql asp.net-membership membership-provider
来自 MSDN:
declare @now datetime
set @now= GETDATE()
exec aspnet_Membership_CreateUser 'MyAppName','admin1','pass@word1', '','admin1@contoso.com','','',1,@now,@now,0,0,null
http://msdn.microsoft.com/en-us/library/gg252020(v=office.14).aspx
【讨论】:
这很可能是因为会员资格提供者对密码进行了哈希处理(并对其加盐)以进行保存和检索(比较的是哈希值,而不是未哈希处理的密码)。
我猜你运行了aspnet_Membership_CreateUser 存储过程。这将输入一个未散列的密码(和错误的盐)。
换句话说,您需要使用成员资格提供程序/API 来创建、检索和验证。
【讨论】:
尝试以下脚本:
步骤 1. 对密码和盐进行编码的用户定义函数
CREATE FUNCTION [dbo].[base64_encode] (@data VARBINARY(MAX)) RETURNS VARCHAR(MAX) WITH SCHEMABINDING,
RETURNS NULL ON NULL INPUT BEGIN RETURN
( SELECT [text()] = @data
FOR XML PATH('') ) END GO
Step 2. 创建会员用户的存储过程
CREATE PROCEDURE [dbo].[CreateUser]
@UserName nvarchar(256)
, @ClearTextPassword nvarchar(128)
, @Email nvarchar(256)
, @pUserId uniqueidentifier
AS
BEGIN
DECLARE @ApplicationName nvarchar(256)
DECLARE @PasswordFormat int
DECLARE @UnencodedSalt uniqueidentifier
DECLARE @Password nvarchar(128)
DECLARE @PasswordSalt nvarchar(128)
DECLARE @Now DATETIME
DECLARE @UniqueEmail int
DECLARE @UserId uniqueidentifier
SET @ApplicationName = 'ApplicationName' --Find in aspnet_Applications.ApplicationName
SET @PasswordFormat = 1
SET @UnencodedSalt = NEWID()
SET @PasswordSalt = dbo.base64_encode(@UnencodedSalt)
SET @Password = dbo.base64_encode(HASHBYTES('SHA1',
CAST(@UnencodedSalt as varbinary(MAX))
+ CAST(@ClearTextPassword AS varbinary(MAX)) ))
SET @Now = getutcdate()
SET @UniqueEmail = 1
SET @UserId=@pUserId
BEGIN TRANSACTION
--DECLARE @UserId uniqueidentifier
EXECUTE [dbo].[aspnet_Membership_CreateUser]
@ApplicationName
,@UserName
,@Password
,@PasswordSalt
,@Email
,NULL
,NULL
,1 -- IsApproved == true
,@Now
,@Now
,@UniqueEmail
,@PasswordFormat
,@UserId OUTPUT
COMMIT
END
GO
步骤 3. 创建用户
DECLARE @UserId uniqueidentifier
SET @UserId = NewId()
EXECUTE [dbo].[CreateUser]
'UserName' --@UserName
,'UserP@ssword '--@ClearTextPassword
,'user@email.com '--@Email
,@UserId --User's uniqueidentifier
补充说明:
【讨论】: