成员资格CreateUser和相关表

时间:2011-12-09 00:05:52

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

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

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

是否有可能,如果是这样,有人能指出我如何实现这一目标的良好资源?

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

谢谢, d

4 个答案:

答案 0 :(得分:1)

您将构建custom provider

答案 1 :(得分:1)

创建一个继承membershiprovrov的自定义提供程序。覆盖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>

答案 2 :(得分:1)

我做到了!我首先创建我的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 :(得分:1)

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

不幸的是,如果某些内容失败,您无法使用TransactionScope回滚事务,因为CreateUsre将使用您的代码中的单独数据库连接,这将需要将事务提升为一个不确定的事务,这是一个很难配置和设置。

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

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