matthew Zhang

慢慢学习,慢慢进步!
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

使用Membership服务与自己写的用户数据库关联

Posted on 2008-10-30 00:10  matthewZhang  阅读(297)  评论(0编辑  收藏  举报

Membership服务提供了成员服务,往往自己也会写很多的数据库,其中需要和成员关联,完全用Profile不现实,这里就涉及到UserID的问题

我采取的方法是单独建立一个表,建立MemberShip提供的UserID和自己的数据库之间的一对一关系
可能你觉得维护这个表是个很麻烦的事情,其实维护这个表并不麻烦,我们要做的就是在新建和删除用户的时候自动在这张表里加入个删除相应的数据。
我在这个表里面加入了三个字段,UserID存放Guid类型的MemberShip中的ID,uid存放自动增加的uid,为方便起见,也加入了userName字段存放用户名,事实上完全还可以在这个数据表里面加入其他用户信息,不过数据库概论告诉我们,这个一对一的表里面不该放太多的东西

我们新建一个类,继承默认的SqlMembershipProvider
代码如下: 


 

   public class UserMemberShipProvider : SqlMembershipProvider
{
//
// 摘要:
// 向 SQL Server 成员资格数据库添加一个新用户。
//
// 参数:
// isApproved:
// 是否允许验证新用户。
//
// passwordAnswer:
// 新用户的密码提示问题答案。
//
// username:
// 新用户的用户名。
//
// providerUserKey:
// 唯一标识 SQL Server 数据库中成员资格用户的 System.Guid。
//
// password:
// 新用户的密码。
//
// passwordQuestion:
// 新用户的密码提示问题。
//
// email:
// 新用户的电子邮件地址。
//
// status:
// 一个 System.Web.Security.MembershipCreateStatus 值,指示是否成功创建用户。
//
// 返回结果:
// 用于新创建用户的 System.Web.Security.MembershipUser 对象。
//如果没有创建用户,此方法将返回null。
public override MembershipUser CreateUser(
string username,
string password,
string email,
string passwordQuestion,
string passwordAnswer,
bool isApproved,
object providerUserKey,
out MembershipCreateStatus status)
{
MembershipUser user
= base.CreateUser(
username,
password,
email,
passwordQuestion,
passwordAnswer,
isApproved,
providerUserKey,
out status);
if (status == MembershipCreateStatus.Success)
{
//添加User 表中内容
DbHelper.ExecuteNonQuery(
"INSERT INTO [Users] ([userID],[userName]) VALUES (@userID,@userName)",
DbHelper.MakeParameter(
"userID", DbType.Guid, user.ProviderUserKey),
DbHelper.MakeParameter(
"userName", DbType.String, user.UserName));
}
return user;
}

//
// 摘要:
// 从 SQL Server 成员资格数据库删除用户的成员资格信息。
//
// 参数:
// username:
// 要删除的用户的名称。
//
// deleteAllRelatedData:
// 如果为 true,则从数据库中删除与该用户相关的数据;
//如果为 false,则将与该用户相关的数据保留在数据库。
// // 返回结果:
// 如果用户已删除,则为 true;否则为 false。
//如果数据库中没有此用户,也会返回 false 值。
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
object userID = GetUser(username, false).ProviderUserKey;
bool isDeleted = base.DeleteUser(username, deleteAllRelatedData);
if (isDeleted)
{
//删除User表中内容
DbHelper.ExecuteNonQuery("DELETE FROM [Users] WHERE userID=@userID",
DbHelper.MakeParameter(
"userID", DbType.Guid, userID));
}
return isDeleted;
}
}

 



其中DbHelper是操作数据库的DAL类,就是做一些基本的添加删除工作

这样在自己的数据库中就可以完全按照uid进行处理,不用管任何和那个Guid相关的问题了。


对了 看看web.config里面怎么写的

<membership>
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
type
="ABSC.MemberShipProvider.UserMemberShipProvider"
connectionStringName
="LocalSqlServer"
enablePasswordRetrieval
="false"
enablePasswordReset
="true"
requiresQuestionAndAnswer
="true"
applicationName
="/"
requiresUniqueEmail
="false"
passwordFormat
="Hashed"
maxInvalidPasswordAttempts
="5"
minRequiredPasswordLength
="1"
minRequiredNonalphanumericCharacters
="0"
passwordAttemptWindow
="10"
passwordStrengthRegularExpression
=""
/>
</providers>
</membership>