2010-10-11 103 views
6

我的工作實現自定義的成員提供,對我的數據庫中現有的模式工作,並有一些想法/問題。登錄控制和自定義成員資格提供

Login控件會自動調用成員提供的方法的ValidateUser,所以無論我如何實現提供商的登錄控制關心的是通過這個方法返回的布爾值的唯一的事。我感到困惑的是登錄嘗試失敗的原因可能有很多,用戶被鎖定,在一段時間內嘗試過太多等等。我無法將這些信息傳達給控制器,因此它可以顯示正確的信息。成員資格提供程序的其他屬性(如PasswordStrengthRegularExpression)對登錄控件(開箱即用)絕對沒有影響,我希望它會自動以某種方式轉換爲正則表達式驗證程序,但似乎並不是案件。因此,如果我希望他們採用控件本身,我似乎需要使用提供者配置中的這些設置來初始化登錄控件屬性。

如果登錄控件開箱即用(沒有手動處理事件並按上述方法進行初始化),只需調用成員資格提供程序上的ValidateUser方法,但我無法將其傳遞迴Login控制驗證失敗的原因,甚至可以根據特定的時間窗限制驗證請求。最終我的問題是爲什麼我甚至會使用會員提供商,然後與登錄控制結合使用?看起來它只是設計用於Yes/No類型的響應,這是非常嚴格的。如果我想用不同消息的邏輯構建回用戶,我需要處理登錄控制事件並調用我自己的身份驗證類,這些類將處理我所有的業務需求,並將自定義錯誤消息返回給Login控件以返回向用戶顯示,以便他們知道他們的嘗試爲何失效。

除非我錯了,在我的假設,似乎登錄控件作爲成員API之間的接口是過於嚴格是有用的。也許這個API更適合像ChangePassword這樣的其他認證控制,但對於實際的登錄控制,我沒有看到這一點。

我很感激你的想法。

回答

4

你是對的。要實現您正在討論的邏輯,您需要實施Authenticate事件。這樣,您可以在自行驗證後寫回自定義錯誤消息。

在另一方面,我不認爲密碼強度應驗證身份驗證,而是基於用戶創建。

你可以寫這樣的事情:

protected void Login_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    try 
    { 
     e.Authenticated = myMembershipProvider.ValidateUser(LoginControl1.UserName,LoginControl.Password); 

    } 
    catch(Exception ex) 
    { 
     LoginControl1.FailrureText = ex.Message; 
    } 
} 

,並拋出定製的異常在你的ValidateUser方法。快樂編碼...

+0

會員供應商在這一點上不會失去對我的價值嗎?如果我提前處理Authenticate事件,那麼我必須自己調用提供者上的ValidateUser方法。這種方法不夠,所以我不得不調用另一種方法,實際上會告訴我爲什麼登錄失敗。我同意你的密碼強度。 – e36M3 2010-10-11 20:40:08

+0

@ e36M3 - 你說得對。這是要走的路。我要做的是先調用所有驗證,在控件的ErrorMessage屬性上寫入錯誤,最後如果失敗了, – 2010-10-12 06:01:23

2

我有同樣的問題在使用登錄相關方法(更改密碼)與成員資格提供在哪裏,我想了解更多信息,不只是一個是/否。希望您可以實施類似於我提出的解決方法的解決方案。看到這一點:

Membership provider ChangePassword method return type problem

+0

謝謝,很高興知道我不會發瘋。難道不是因爲我們在這裏錯過了某些東西?這讓我想先拋開會員供應商。我不需要它,如果我將不得不破解它並且破解控件以使用它來獲取簡單的東西,比如更有用的錯誤消息。對我來說,提供商唯一的好處就是與控件一體化,這似乎是非常有限的。 – e36M3 2010-10-11 20:19:54

1

歐凱,如果你不能改變登錄控制的事情,最終你會需要另一個登錄控制接口!

相關問題