Членство CreateUser и связанные таблицы - PullRequest
2 голосов
/ 09 декабря 2011

Я только что переключился на провайдера членства .Net, чтобы управлять моими пользователями. У меня есть таблица, относящаяся к таблице Users, которая называется UserGroupDetails . Я хотел бы добавить строку в эту таблицу при вызове Membership.CreateUser . Если при добавлении пользователя происходит сбой, я бы хотел убедиться, что запись в UserGroupDetails удалена или не добавлена, а если при добавлении записи в UserGroupDetails произойдет сбой, я бы хотел членство . CreateUser завершится неудачно, а пользователь не будет добавлен.

Меня не очень интересует использование SqlProfileProvider, и я не нашел никакой информации о переопределении или изменении Membership.CreateUser для выполнения этой дополнительной вставки.

Возможно ли, и если да, то может ли кто-нибудь указать мне хороший ресурс о том, как этого добиться?

Кроме того, я не хочу переписывать весь метод Membership.CreateUser . Скорее я хотел бы просто добавить к этому. Я посмотрел на http://msdn.microsoft.com/en-us/library/ms366730.aspx, но это похоже на восстановление колеса.

Спасибо, D

Ответы [ 4 ]

1 голос
/ 09 декабря 2011

Вам не нужно создавать собственного провайдера. Просто добавьте свой код, чтобы подключить таблицу UserGroupDetails после вызова CreateUser.

К сожалению, вы не можете использовать TransactionScope для отката транзакции в случае сбоя, потому что CreateUsre будет использовать отдельное соединение с базой данных из вашего кода, и для этого потребуется преобразовать транзакцию в разрозненную транзакцию, что очень сложно настроить и настройка.

Самое простое решение - просто проверить сбой CreateUser, и не выполнять второй бит кода, если он потерпит неудачу, и удалить созданного пользователя, если ваш второй бит потерпел неудачу. Однако это не является надежной защитой, поскольку в некоторых случаях вы можете иметь потерянные записи.

Чтобы сделать это в одной транзакции, единственное решение - это специальный провайдер, но я лично не думаю, что оно того стоит.

1 голос
/ 09 декабря 2011

Создание собственного провайдера, который наследует членствоrovrovider.Переопределите метод создания пользователя для расширения функциональности.Вызовите base.CreteUser и затем добавьте свой код для добавления дополнительных записей в свою пользовательскую таблицу.

ОБНОВЛЕНИЕ:

Вот как будет выглядеть ваш пользовательский поставщик

using System.Web.Security;

namespace YourNameSpace
{

    public class CustomSqlMembershipProvider : SqlMembershipProvider
    {

        public bool CreateUser(//list of parameters)
        {
            bool UserCreated = false;
            MembershipCreateStatus status;

            //provide the required parameters 
            base.CreateUser(//list of parameters);

            if (status == 0)//user was successfully created
            { 
                //perform your custom code
                //if success 
                UserCreated = true;
            }

            return UserCreated
        }
    }
}

Убедитесь, что вы указали свой новый пользовательский поставщик в файле Web.config

   <membership defaultProvider="CustomMembeshipProvider">
      <providers>
        <clear/>
        <add connectionStringName="Your connection string name" name="CustomMembeshipProvider"
             type="YourNameSpace.CustomSqlMembershipProvider" />
      </providers>
    </membership>
1 голос
/ 09 декабря 2011

Я сделал это! Сначала я создаю своего пользователя aspnet. Вот что я делаю.

1) Я добавил это в свой web.config:

<system.web>
        <membership>
            <providers>
                <clear/>
                <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
                     enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
                     maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
                     applicationName="[ApplicationName]" />
            </providers>
        </membership>
        <machineKey validationKey="[]" decryptionKey="[]" decryption="3DES" validation="SHA1" />
 <connectionStrings>
<add name="ApplicationServices" connectionString="Data Source=(local);Initial Catalog=[DataBaseName];User ID=[UserName];Password=Password" providerName="System.Data.SqlClient" />
 </connectionStrings>
 </system.web>

2) Затем я использую это для создания своей пользовательской таблицы

   var user = Membership.CreateUser(request.UserName, request.Password, request.Email);

3) Наконец я беру свой идентификатор пользователя aspnet, который я только что создал, и связываю его с моим пользовательским пользователем

user.ProviderUserKey.ToString();

Вы можете создать некоторую логику для удаления пользователя aspnet, если вставка в UserGroupDetails не удалась.

1 голос
/ 09 декабря 2011
...