我有這樣的代碼工作:
// Create MembershipUser...
MembershipUser membershipUser = null;
// Create a MembershipCreateStatus Status for Reporting...
MembershipCreateStatus status = new MembershipCreateStatus();
// Update the private connection string field in the base class.
string connectionString = "Data Source=SERVER;Initial Catalog='My Company Database';User ID=USERNAME;Password=PASSWORD";
// Application Name...
string applicationName = "My Company Database";
// Username of the account to add...
string username = "NewUser";
// Generate a dynamic Password....
string password = Membership.GeneratePassword(12, 3);
// Email Address of the User...
string email = "[email protected]";
// The Password Question...
string passwordQuestion = "What is my Password?";
// The Password Answer...
string passwordAnswer = "My Password is: .....";
// Is Approved...
bool isApproved = true;
// Current Time Utc...
DateTime dateTimeUtc = DateTime.UtcNow;
// Create Date...
DateTime createDateTime = DateTime.Now;
// uniqueEmail =
int uniqueEmail = 1;
// Password Format...
int passwordFormat = 1;
// Set the GUID...
Guid guid= Guid.NewGuid();
if (membershipUser == null)
{
SqlConnection sqlConnection = new SqlConnection(connectionString);
SqlCommand sqlCommand = new SqlCommand("aspnet_Membership_CreateUser", sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add("@ApplicationName", SqlDbType.NVarChar, 255).Value = applicationName; // Input Parameter...
sqlCommand.Parameters.Add("@UserName", SqlDbType.NVarChar, 255).Value = username; // Input Parameter...
sqlCommand.Parameters.Add("@Password", SqlDbType.NVarChar, 127).Value = password; // Input Parameter...
sqlCommand.Parameters.Add("@PasswordSalt", SqlDbType.NVarChar, 127).Value = password; // Input Parameter...
sqlCommand.Parameters.Add("@Email", SqlDbType.NVarChar, 255).Value = email; // Input Parameter...
sqlCommand.Parameters.Add("@PasswordQuestion", SqlDbType.NVarChar, 255).Value = passwordQuestion; // Input Parameter...
sqlCommand.Parameters.Add("@PasswordAnswer", SqlDbType.NVarChar, 127).Value = passwordAnswer; // Input Parameter...
sqlCommand.Parameters.Add("@IsApproved", SqlDbType.Bit).Value = isApproved; // Input Parameter...
sqlCommand.Parameters.Add("@CurrentTimeUtc", SqlDbType.DateTime, 7).Value = dateTimeUtc; // Input Parameter...
sqlCommand.Parameters.Add("@CreateDate", SqlDbType.DateTime, 7).Value = createDateTime; // Input Parameter...
sqlCommand.Parameters.Add("@UniqueEmail", SqlDbType.Int, 3).Value = uniqueEmail; // Input Parameter...
sqlCommand.Parameters.Add("@PasswordFormat", SqlDbType.Int, 3).Value = passwordFormat; // Input Parameter...
sqlCommand.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier, 15).Value = guid; // Output Parameter...
try
{
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
status = MembershipCreateStatus.Success;
}
catch (SqlException ex)
{
richTextBox1.Text = ex.ToString();
status = MembershipCreateStatus.ProviderError;
}
finally
{
sqlConnection.Close();
}
this.textBox1.Text = status.ToString();
的明顯的一點就是目前我沒有現有用戶,Email等的檢查。我還需要散列密碼答案並修復SaltPassword設置。
這裏是默認ASP提供商SQL存儲過程CREATEUSER:
ALTER PROCEDURE [dbo].[aspnet_Membership_CreateUser]
@ApplicationName nvarchar(256),
@UserName nvarchar(256),
@Password nvarchar(128),
@PasswordSalt nvarchar(128),
@Email nvarchar(256),
@PasswordQuestion nvarchar(256),
@PasswordAnswer nvarchar(128),
@IsApproved bit,
@CurrentTimeUtc datetime,
@CreateDate datetime = NULL,
@UniqueEmail int = 0,
@PasswordFormat int = 0,
@UserId uniqueidentifier OUTPUT
AS
BEGIN
DECLARE @ApplicationId uniqueidentifier
SELECT @ApplicationId = NULL
DECLARE @NewUserId uniqueidentifier
SELECT @NewUserId = NULL
DECLARE @IsLockedOut bit
SET @IsLockedOut = 0
DECLARE @LastLockoutDate datetime
SET @LastLockoutDate = CONVERT(datetime, '17540101', 112)
DECLARE @FailedPasswordAttemptCount int
SET @FailedPasswordAttemptCount = 0
DECLARE @FailedPasswordAttemptWindowStart datetime
SET @FailedPasswordAttemptWindowStart = CONVERT(datetime, '17540101', 112)
DECLARE @FailedPasswordAnswerAttemptCount int
SET @FailedPasswordAnswerAttemptCount = 0
DECLARE @FailedPasswordAnswerAttemptWindowStart datetime
SET @FailedPasswordAnswerAttemptWindowStart = CONVERT(datetime, '17540101', 112)
DECLARE @NewUserCreated bit
DECLARE @ReturnValue int
SET @ReturnValue = 0
DECLARE @ErrorCode int
SET @ErrorCode = 0
DECLARE @TranStarted bit
SET @TranStarted = 0
IF(@@TRANCOUNT = 0)
BEGIN
BEGIN TRANSACTION
SET @TranStarted = 1
END
ELSE
SET @TranStarted = 0
EXEC dbo.aspnet_Applications_CreateApplication @ApplicationName, @ApplicationId OUTPUT
IF(@@ERROR <> 0)
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
SET @CreateDate = @CurrentTimeUtc
SELECT @NewUserId = UserId FROM dbo.aspnet_Users WHERE LOWER(@UserName) = LoweredUserName AND @ApplicationId = ApplicationId
IF (@NewUserId IS NULL)
BEGIN
SET @NewUserId = @UserId
EXEC @ReturnValue = dbo.aspnet_Users_CreateUser @ApplicationId, @UserName, 0, @CreateDate, @NewUserId OUTPUT
SET @NewUserCreated = 1
END
ELSE
BEGIN
SET @NewUserCreated = 0
IF(@NewUserId <> @UserId AND @UserId IS NOT NULL)
BEGIN
SET @ErrorCode = 6
GOTO Cleanup
END
END
IF(@@ERROR <> 0)
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
IF(@ReturnValue = -1)
BEGIN
SET @ErrorCode = 10
GOTO Cleanup
END
IF (EXISTS (SELECT UserId
FROM dbo.aspnet_Membership
WHERE @NewUserId = UserId))
BEGIN
SET @ErrorCode = 6
GOTO Cleanup
END
SET @UserId = @NewUserId
IF (@UniqueEmail = 1)
BEGIN
IF (EXISTS (SELECT *
FROM dbo.aspnet_Membership m WITH (UPDLOCK, HOLDLOCK)
WHERE ApplicationId = @ApplicationId AND LoweredEmail = LOWER(@Email)))
BEGIN
SET @ErrorCode = 7
GOTO Cleanup
END
END
IF (@NewUserCreated = 0)
BEGIN
UPDATE dbo.aspnet_Users
SET LastActivityDate = @CreateDate
WHERE @UserId = UserId
IF(@@ERROR <> 0)
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
END
INSERT INTO dbo.aspnet_Membership
(ApplicationId,
UserId,
Password,
PasswordSalt,
Email,
LoweredEmail,
PasswordQuestion,
PasswordAnswer,
PasswordFormat,
IsApproved,
IsLockedOut,
CreateDate,
LastLoginDate,
LastPasswordChangedDate,
LastLockoutDate,
FailedPasswordAttemptCount,
FailedPasswordAttemptWindowStart,
FailedPasswordAnswerAttemptCount,
FailedPasswordAnswerAttemptWindowStart)
VALUES (@ApplicationId,
@UserId,
@Password,
@PasswordSalt,
@Email,
LOWER(@Email),
@PasswordQuestion,
@PasswordAnswer,
@PasswordFormat,
@IsApproved,
@IsLockedOut,
@CreateDate,
@CreateDate,
@CreateDate,
@LastLockoutDate,
@FailedPasswordAttemptCount,
@FailedPasswordAttemptWindowStart,
@FailedPasswordAnswerAttemptCount,
@FailedPasswordAnswerAttemptWindowStart)
IF(@@ERROR <> 0)
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
IF(@TranStarted = 1)
BEGIN
SET @TranStarted = 0
COMMIT TRANSACTION
END
RETURN 0
Cleanup:
IF(@TranStarted = 1)
BEGIN
SET @TranStarted = 0
ROLLBACK TRANSACTION
END
RETURN @ErrorCode
END
在我看來,有默認的MembershipProvider大的限制,如果你想在我的情況做簡單的東西,比如在哪裏想在ASP Web應用程序之外創建一個新用戶。也許有另一種方法可以做到這一點更簡單?
如果有人有更好的答案,那麼我真的appreaciate輸入?
謝謝。
我遇到了身份驗證問題。上面的代碼插入一個用戶,但我不能登錄到網站。我嘗試了幾種方法來哈希和鹽密碼和密碼鹽,但仍然沒有運氣。仍在研究這個問題。 – 2012-02-07 21:26:22