我刚刚切换到.Net会员提供商来管理我的用户。我有一个名为 UserGroupDetails 的Users表的表。当调用 Membership.CreateUser 时,我想在此表中添加一行。如果添加用户失败,我想确保删除或不添加 UserGroupDetails 中的记录,如果将记录添加到 UserGroupDetails 失败,我希望 Membership.CreateUser 失败,用户无法添加。
我对使用SqlProfileProvider并不感兴趣,但我没有找到任何有关覆盖或修改 Membership.CreateUser 的信息来执行此附加插入。
是否有可能,如果是这样,有人能指出我如何实现这一目标的良好资源?
另外,我不想重写整个 Membership.CreateUser 方法。相反,我想简单地添加它。我看过http://msdn.microsoft.com/en-us/library/ms366730.aspx,但这似乎正在重建轮子。
谢谢, d
答案 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是否失败,如果失败则不执行第二位代码,如果第二位失败则删除创建的用户。但是,这并非万无一失,因为在某些情况下您可能会有孤立记录。
为了在单个事务中执行此操作,那么唯一的解决方案是自定义提供程序,但我个人认为这不值得付出努力。