2


爲什麼底層會員供應商應該決定是否......?

A)爲什麼,使用模板時的CreateUserWizard控制,也包括文本框ID =電子郵件取決於CreateUserWizard.RequireEmail屬性是否設置爲true,但文本框ID =問題只有在底層會員供應商需要密碼問題時才需要? 換句話說,爲什麼不能由底層會員提供商決定是否需要文本框,ID =電子郵件)?


B)。另一方面,爲什麼要由會員提供,以決定是否需要輸入密碼的問題?難道這不應該高達會員級別來決定?最後,成員提供者的工作應該是提供對底層數據存儲的訪問,而不是決定用戶必須提供什麼數據?!


感謝名單


編輯:

A)

它歸結爲會員提供有一個明顯的映射的事實: RequiresQuestionAndAnswer,您可以設置並執行此操作,但不能指定用戶必須提供電子郵件地址。

所以RequiresUniqueEmail實質上告訴用戶不必指定一個電子郵件地址,但如果她這樣做,它必須是唯一的?


B)

  • 如果我理解正確的會員供應商,它們是發送SQL查詢與數據存儲實體?因此,我假設他們對這些數據存儲具有充分的表格和關係等知識。

  • 但是,如果數據存儲沒有用於存儲電子郵件地址的列,但是CreateUser()將電子郵件地址指定爲其參數之一呢?會員提供者如何處理?

回答

2

電子郵件是預期數據字段的一部分,這是一個有趣的觀點。

讓我澄清......如果您爲SQL提供程序設置RequiresUniqueEmail爲true,則不需要電子郵件 - 嚴格來說。這只是意味着每個用戶都必須使用來自其他任何用戶的不同電子郵件地址。所以可以有一個用戶沒有電子郵件地址。數據庫中將設置一個空值。但是之後沒有其他用戶能夠忽略電子郵件地址,因爲這會導致兩個用戶有空電子郵件......所以在功能上它可能與所需的電子郵件地址相同,但它在技術上並不相同。

嚮導控件提供用於收集成員資格信息的默認UI,並假定您使用的將使用默認的SQL提供程序。如果您沒有使用默認提供程序,您的提供程序不支持所有字段,或者您的提供程序中有其他唯一約束,那麼您應該使用自己的模板自定義嚮導步驟,並處理嚮導的事件以提供自己的驗證以及適當的附加邏輯。

至於瞭解會員制本身......

會員制度在asp.net之間嚴格的面向對象的設計和便利的妥協。基礎MembershipProvider類中有一些假設,特定的成員資格提供程序從中繼承了這些假設。電子郵件地址將成爲基本提供商提供的一種更自由的假設中的會員資料的一部分。

儘管如此,在大多數環境中都是如此,會員系統能夠以簡單直觀的方式公開一些與電子郵件地址相關的功能(例如通過他們的電子郵件地址而不是用戶名並禁止具有相同電子郵件地址的多個帳戶)。如果基類沒有做出這樣的假設,那麼每當你想要在你的特定提供者中使用電子郵件進行操作時,就必須將引用轉換爲你在應用程序中使用的特定類型。這很麻煩。

從純粹的面向對象的角度來看,這些假設是不舒服的。但是,如果不使用它們,許多成員提供者可以爲基類的方法和屬性提供空實現。

您可以通過角色提供者瞭解更多...例如,Windows令牌角色提供程序有很多成員會拋出NotImplmentedException(Token角色提供程序是AD的只讀提供程序,因此所有屬性設置訪問器拋出異常)。

+0

我可以問一下:如果Membership.CreateUser()指定已存在的電子郵件,而成員資格提供者需要唯一的電子郵件,則Status參數將通知您這一點,並且Membership.CreateUser()將返回空引用。但是,如果成員資格提供程序的RequiresQuestionAndAnswer設置爲true,但Membership.CreateUser()不提供密碼問題和答案,則會引發異常。 但是,當Membership.CreateUser()未提供唯一電子郵件時,爲什麼也不會引發異常?畢竟,在這兩種情況下用戶都沒有創建?! – SourceC 2009-05-06 19:58:48

+0

順便說一句 - 我假設Membership.CreateUser()調用MembershipProvider.CreateUser()? – SourceC 2009-05-06 19:59:48

+2

是的,Membership.CreateUser()只是傳遞給默認提供者的CreateUser()方法。 – 2009-05-09 11:52:11

1

它歸結爲一個事實,即成員提供有一個明顯的映射:RequiresQuestionAndAnswer,您可以設置和有這種強制執行,但你不能指定用戶必須提供一個電子郵件地址。

指定他們必須提供一個唯一的電子郵件地址RequiresUniqueEmail與說「需要一封電子郵件」不同 - 因此CreateUserWizard爲您提供了一個選項,說「我不在乎電子郵件地址不是獨特的,只是有一個「。

至於爲什麼成員資格提供者應該控制是否需要問題:這是因爲提供者也在控制諸如EnablePasswordReset和EnablePasswordRetrieval之類的東西 - 這些都是美世紀類不知道的 - 事實上,即使成員資格類在web.config中指定要做到這一點是「ValidateUser」的方法,它會使用默認提供:

Membership類依賴於成員資格提供與數據源進行通信。


在對問題的編輯:

一個。這是正確的,因爲Stephen points out,您可以讓一個用戶使用空的電子郵件地址,然後所有其他用戶都必須擁有一個值。根據您的驗證器,這實際上不一定是有效的電子郵件地址。

b.1。不完全 - 提供程序向用戶數據存儲區發送數據 - 這可能是SQL,但也可能是Active Directory,LDAP,文本文件等,但是,您的提供程序充當應用程序和應用程序之間的分離層您的用戶商店。

b.2。有許多會員資格 - 關於implementing a custom Membership User的文檔將引導您完成創建自定義用戶所需的步驟 - 如果您的數據存儲沒有處理電子郵件地址(或者您希望多個電子郵件存儲在配置文件中),那麼您的提供商可能只是忽略在創建或更新時發送給您的任何值,並在get時使用null填充它。