创建一个用于 ASP.NET Membership 提供程序的用户脚本

9
我创建了一堆插入脚本,用于向aspnet_Membership和aspnet_User表添加新用户。我无法进行身份验证,因为它找不到我的用户。
有人尝试过使用T-SQL插入来创建新的成员资格用户吗?我必须以这种方式执行,因为我们在C#/ASP.NET中的创建用户代码目前无法正常工作。
3个回答

15

2
请尝试以下脚本:
步骤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

第二步。创建会员用户的存储过程。
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

第三步. 创建用户
DECLARE @UserId uniqueidentifier

SET @UserId = NewId()

EXECUTE [dbo].[CreateUser] 
           'UserName'   --@UserName
          ,'UserP@ssword '--@ClearTextPassword
          ,'user@email.com '--@Email
          ,@UserId --User's uniqueidentifier

附加说明:

  1. 检查您的应用程序名称是否在web.config成员资格元素中正确。
  2. 记得创建角色并将用户添加到角色中。

1
我在哪里可以找到[aspnet_Membership_CreateUser],还是我的SQL Server管理员把我锁出去了...? - Don Thomas Boyle
这里也有同样的问题。如果你让Visual Studio设置成员资格提供程序表,那么你将无法使用aspnet_Membership_CreateUser命令。 - Michael

2

这很可能是因为会员提供程序对密码进行哈希(并加盐)以保存和检索(比较的是哈希值,而不是未经哈希处理的密码)。

我猜你运行了 aspnet_Membership_CreateUser 存储过程。这将放置一个未经哈希处理的密码(和错误的盐)。

换句话说,您需要使用会员提供程序/API 来创建、检索和验证。


1
不,我只是从我的另一个用户那里复制了现有的密码和盐,并在插入语句中为这个新用户使用了它。 - PositiveGuy
1
“Membership provider/API” 好吧,这就是代码中出现的问题,我现在没有时间修复它...需要立即为维护紧急情况/测试创建一个用户。 - PositiveGuy
@CoffeeAddict 好的,那就这么做吧。创建一个应用程序,其中包含一个配置文件,其中包含一个指向您的数据库的connectionString,使用该连接字符串(和您的其他应用程序名称)的成员资格提供程序部分,并具有相同详细信息的roleManager。 - user596075

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接