ASP.Net Установка правильной строки подключения при вызове Membership.CreateUser () - PullRequest
1 голос
/ 06 февраля 2012

Это продолжение моего последнего вопроса: «Внутренняя база данных - ASP.NET Auto Регистрация веб-сайта при создании пользователя».Я запускаю следующий код.Это всего лишь тестовый блок кода.Это работает, но моя проблема в том, что он создает файл SQLEXPRESS ASPNETDB.MDF по умолчанию в каталоге App_Data.Я не этого хочуих в мою базу данных.Этот код не работает в приложении веб-сайта ASP.Мой "конфиг" не инициализируется из того, что я вижу.Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Наконец-то решение, которое работает через мой веб-сайт и внутреннюю базу данных C #.

Крутая кривая обучения с моей стороны.На самом деле все гораздо проще, чем я думал.Вот код, который нужно ввести в файл app.config, который должен быть в вашем проекте C #:

<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="My Company Database.Properties.Settings.ConnectionString"
    connectionString="Data Source=Server;Initial Catalog='My Company Database';Persist Security Info=True;User ID=MyUserName;Password=MyPassword"
    providerName="System.Data.SqlClient" />
</connectionStrings>

<system.web>
<compilation debug="true" targetFramework="4.0" />

<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>

<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="My Company Database.Properties.Settings.ConnectionString"
         enablePasswordRetrieval="False" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
</providers>
</membership>

</system.web>

</configuration>

Вот код, который использует членство по умолчанию MembershipProvider ():

// Create a MembershipCreateStatus Status for Reporting...
MembershipCreateStatus status = new MembershipCreateStatus();

// Username of the account to add...
string username = "User121";
// Generate a dynamic Password....
string password = "P@55W0Rd";
// Email Address of the User...
string email = "email@email.com";
// Password Question of the User...
string passwordQuestion = "My Password Question?";
// Password Answer of the User...
string passwordAnswer = "My Password Answer!";

try
{
Membership.CreateUser(username, password, email, passwordQuestion, passwordAnswer, true, out status);
}
catch (Exception ex)
{
    this.richTextBox1.Text = "Error...\r\n\r\n" + ex.ToString();
}

this.richTextBox1.Text = ("Account Creation   : " + status.ToString() + "\r\n"
                                + "Username is        : " + username + "\r\n"
                                + "Password is        : " + password + "\r\n"
                                + "Email              : " + email);

Я пытался добавить web.config так же, как веб-приложение ASP.NET, но это не удалось.Я даже не думал помещать конфигурацию в app.config до сегодняшнего дня.Забавно, как работает мозг, пытаясь решить проблему.

Хеширование и посоление паролей обрабатываются классом MembershipProvider по умолчанию, который встроен в .NET.Нет необходимости делать какие-либо сумасшедшие хеширование и засолку.

0 голосов
/ 06 февраля 2012

У меня работает этот код:

// 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@email.com";
// 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.

Вот хранимая процедура SQL поставщика ASP по умолчанию для 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 нового пользователя.Может быть, есть другой способ сделать это проще?

Если у кого-то есть лучший ответ, я бы действительно оценил ввод?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...