最近,在項(xiàng)目中使用了2.0中的 Membership 框架,本文將在這里討論如何將其進(jìn)行擴(kuò)展,以適應(yīng)實(shí)際項(xiàng)目的需求。期間,經(jīng)過不斷的摸索領(lǐng)會(huì),也查找了一些相關(guān)的資料,下面將會(huì)給出完整的一個(gè)解決方案——通過表關(guān)聯(lián)的方式進(jìn)行擴(kuò)展。當(dāng)然,這只是實(shí)現(xiàn)的一個(gè)思路,在此和大家探討。新疆軟件開發(fā)網(wǎng) 網(wǎng)上也有很多相關(guān)的討論解決方案的文章,但是大多數(shù)都是梗概,沒有詳細(xì)地引導(dǎo)初接觸該框架的開發(fā)者如何進(jìn)行實(shí)現(xiàn)。這里提出的方案思路是:通過userid字段進(jìn)行關(guān)聯(lián),相信但凡要用Membership的開發(fā)人員都熟悉那幾個(gè)基本的aspnet_開頭的數(shù)據(jù)表,也已經(jīng)知道它們中各個(gè)字段的含義。 可能大多數(shù)開發(fā)者遇到的問題是:默認(rèn)的aspnet_Users中不足以滿足自定義的用戶信息,而且很多大字段也不適合保存在Profile中,那么,你可以通過如下的方式進(jìn)行用戶注冊(cè):在用戶點(diǎn)擊注冊(cè)按鈕的時(shí)候,首先使用Membership.CreateUser方法在aspnet_Users中注冊(cè)一個(gè)用戶, 注冊(cè)之前,你可以設(shè)定自己項(xiàng)目中所需的注冊(cè)條件,比如,允不允許姓名相同等等(代碼中的條件是:一個(gè)區(qū)只能有一個(gè)該姓名的showfolk)。
if (!showfolkSys.Exists(name, section)) { //啟用membership,創(chuàng)建一個(gè)用戶 try { MembershipUser newUser = Membership.CreateUser(UserName.Text, Password.Text); } catch (MembershipCreateUserException exception) { ErrorMessage.Text = GetErrorMessage(exception.StatusCode); return; } catch (HttpException ex) { ErrorMessage.Text = ex.Message; return; } }
然后,將注冊(cè)信息插入自己的表中。這里為了關(guān)聯(lián)aspnet_Users表,需要在自己定義的表中加入字段userid(GUID)。
下面,先給出一個(gè)創(chuàng)建用戶的存儲(chǔ)過程:InsertUser
CREATE PROCEDURE InsertUser @UserName VARCHAR(50) =NULL , @InstitutionID INT = NULL, @Email VARCHAR(50) = NULL, @Phone VARCHAR(50) =NULL, @Mobile VARCHAR(50) =NULL
AS BEGIN
DECLARE @UserId uniqueidentifier
SELECT @UserId = UserId FROM dbo.aspnet_Users WHERE LOWER(@UserName) = LoweredUserName --AND @ApplicationId = ApplicationId IF ( @UserId IS NOT NULL ) BEGIN INSERT Users( userid, username, institutionID, email, phone, mobile ) VALUES ( @Userid, @UserName, @InstitutionID, @Email, @phone, @mobile ) END
END ------------------------------------------------ GO
存儲(chǔ)過程開始的前兩句就是通過 @UserName 的值來反查 aspnet_Users 中的 UserId字段,接下來再插入到自定義的表中。這樣,成員角色管理部分可以使用默認(rèn)的aspnet_Users表,而自定義的信息可以使用自己的表了。 下面是我在 Web.Config中對(duì) membership 的設(shè)定,去掉了密碼中默認(rèn)需要的特殊字符和唯一的Email地址的限制。供參考。
<membership defaultProvider="AspNetMembershipProvider" userIsOnlineTimeWindow="20"> <providers> <remove name="AspNetSqlMembershipProvider"/> <clear /> <add name="AspNetMembershipProvider" requiresQuestionAndAnswer="false" type="System.Web.Security.SqlMembershipProvider" connectionStringName="SqlServices" enablePasswordRetrieval="false" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="6" enablePasswordReset="false" passwordFormat="Hashed" requiresUniqueEmail="false" applicationName="BJWL"/> </providers> </membership>
|