【问题标题】:Script to create an ASP.NET Membership provider User创建 ASP.NET 成员资格提供程序用户的脚本
【发布时间】:2012-02-09 21:46:22
【问题描述】:

我创建了一堆插入脚本来将新用户添加到 aspnet_Membership 和 aspnet_User 表中。我无法验证,说它找不到我的用户。

有没有人尝试通过 T-SQL 插入创建新的会员用户?我必须这样做,因为我们在 C#/ASP.NET 中创建用户代码目前不起作用。

【问题讨论】:

    标签: asp.net tsql asp.net-membership membership-provider


    【解决方案1】:

    来自 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

    【讨论】:

      【解决方案2】:

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

      我猜你运行了aspnet_Membership_CreateUser 存储过程。这将输入一个未散列的密码(和错误的盐)。

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

      【讨论】:

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

      尝试以下脚本:

      步骤 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
      

      补充说明:

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

      【讨论】:

      • 我从哪里得到 [aspnet_Membership_CreateUser] 还是我的 sql server 管理员把我锁在外面了...?
      • 这里有同样的问题。如果让 Visual Studio 设置成员资格提供程序表,则不会有 aspnet_Membership_CreateUser 命令。
      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多