【问题标题】:Membership CreateUser and related tables成员资格 CreateUser 和相关表
【发布时间】:2011-12-09 00:05:51
【问题描述】:

我刚刚切换到 .Net 会员提供商来管理我的用户。我有一个与名为 UserGroupDetails 的用户表相关的表。当调用 Membership.CreateUser 时,我想在此表中添加一行。如果添加用户失败,我想确保 UserGroupDetails 中的记录已删除或未添加,如果将记录添加到 UserGroupDetails 失败,我希望 Membership.CreateUser 失败并且用户不会被添加。

我对使用 SqlProfileProvider 并不真正感兴趣,也没有找到任何有关覆盖或修改 Membership.CreateUser 以执行此附加插入的信息。

是否有可能,如果可以,有人可以为我指出如何完成此任务的好资源吗?

另外,我不想重写整个 Membership.CreateUser 方法。相反,我想简单地添加它。我看过http://msdn.microsoft.com/en-us/library/ms366730.aspx 但这似乎是在重建轮子。

谢谢, D

【问题讨论】:

    标签: c# asp.net asp.net-membership membership-provider sqlmembershipprovider


    【解决方案1】:

    你会建立一个custom provider

    【讨论】:

      【解决方案2】:

      我已经做到了!我首先创建我的 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 用户 ID,并将其关联到我的自定义用户中

      user.ProviderUserKey.ToString();
      

      如果插入到 UserGroupDetails 失败,您可以创建一些逻辑来删除 aspnet 用户。

      【讨论】:

        【解决方案3】:

        您无需构建自定义提供程序。只需在调用 CreateUser 后添加您的代码来连接您的 UserGroupDetails 表。

        不幸的是,如果某些事情失败,您不能使用 TransactionScope 回滚事务,因为 CreateUsre 将使用与您的代码分开的数据库连接,这需要将事务提升为分布式事务,这很难配置和设置。

        最简单的解决方案就是检查 CreateUser 是否失败,如果失败则不执行第二位代码,如果第二位失败则删除创建的用户。但是,这并非万无一失,因为在某些情况下您可能拥有孤立的记录。

        为了在单个事务中执行此操作,唯一的解决方案是自定义提供程序,但我个人认为这不值得。

        【讨论】:

          【解决方案4】:

          创建一个继承membershipProvider 的自定义提供程序。覆盖 create user 方法以扩展功能。调用 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>
          

          【讨论】:

          • 您是如何传递值来执行“自定义代码”的?我正在遵循这种方法并有这个查询。
          猜你喜欢
          • 2012-10-04
          • 1970-01-01
          • 1970-01-01
          • 2010-12-22
          • 1970-01-01
          • 2012-02-26
          • 2011-08-15
          • 1970-01-01
          • 2013-01-02
          相关资源
          最近更新 更多