2013-06-05 28 views
2

請參閱以下更新:如何允許未經身份驗證的用戶重置密碼?

我使用ASP.NET SQL成員資格提供

到目前爲止,我能夠允許用戶更改其密碼,但只有當他們認證或登錄到應用程序。 我真正需要的是用戶能夠通過電子郵件獲得鏈接。他們可以點擊此鏈接並重置密碼。例如:假設一個用戶忘記了他或她的密碼,他們可以訪問一個頁面,他們可以進入安全問題和答案;或他們的電子郵件地址。然後,他們會收到一封電子郵件,其中包含重置密碼的鏈接。

所有我到目前爲止是這樣的:只允許通過認證的用戶重置其密碼:

我不想使用恢復控制生成一個密碼。

public void ChangePassword_OnClick(object sender, EventArgs args) 
{ 

MembershipUser user = Membership.GetUser(User.Identity.IsAuthenticated); 

try 
{ 
if (user.ChangePassword(OldPasswordTextbox.Text, PasswordTextbox.Text)) 
{ 
Msg.Text = "Password changed."; 
} 
else 
{ 
Msg.Text = "Password change failed. Please re-enter your values and try again."; 
} 
} 
catch (Exception e) 
{ 
Msg.Text = "An exception occurred: " + Server.HtmlEncode(e.Message) + ". 
try again."; 
    } 
} 

我可以創建存儲過程和使用字符串構建的電子郵件,但我不知道如何讓沒有認證用戶更改密碼。有沒有一種方法可以讓用戶在點擊鏈接時進行身份驗證。我不知道怎麼問這個。

感謝您閱讀:

更新:

好吧,我設法拿到了密碼使用此代碼復位:

protected void btnResetPassword_Click(object sender, EventArgs e) 
{ 
    string username = "ApplePie12"; 
    MembershipUser currentUser = Membership.GetUser(username); 
    currentUser.ChangePassword(currentUser.ResetPassword(), txtResetPassword.Text); 
} 

這是我的計劃:

  1. 使此頁面公開,以便通過未經身份驗證的用戶訪問,但只能通過電子郵件鏈接訪問。

  2. 創建用於驗證用戶的存儲過程存在於用戶名中或由安全問題/答案存在。

  3. 如果他們存在,他們被送到包含令牌/ GUID

  4. 最後當他們點擊,他們將登陸這個頁面,要求他們更改密碼鏈接的鏈接。 * 鏈接一旦使用即失效。

我唯一的問題是:做以上所有需要關閉使用安全問題/答案在Web配置文件。

我真的很想將安全問題作爲用戶的選擇,以便通過電子郵件或安全問題進行驗證。如果這是不可能的,我將不得不創建某種帳號或用戶標識(不是成員身份用戶標識)作爲替代。

回答

5

我的答案不是特定於會員提供商,但希望能指出你在正確的方向。通常情況下,這種方法是生成一個非常長的隨機字符串,稱爲令牌。你給他們,其中包括此令牌作爲參數,就像一個鏈接:

http://foo.bar/reset?token=asldkfj209jfpkjsaofiu029j3rjs-09djf09j1pjkfjsodifu091jkjslkhfao

你的應用程序裏面你跟蹤你已經生成的令牌。如果您收到包含該令牌的請求,則認證它,就好像它是該用戶一樣。

一對夫婦的注意事項:

  • 產生應該是隨機的,並在短時間內有效地不可猜測的標記。
  • 令牌只能在生成後的短時間內工作,理想情況下比猜測時間短。
  • 令牌應該只能使用一次。一旦用戶使用它更改了密碼,請將其從系統中刪除。
+1

謝謝克里斯,我沒有想到這個:那麼我如何驗證令牌?我相信我可以生成一個GUID並將其哈希。一旦我知道如何驗證令牌,我就可以做到這一點。示例:我可以創建一個允許用戶輸入電子郵件或安全問題的文本框。如果它匹配一個GUID生成,驗證並通過電子郵件發送給用戶? – Asynchronous

+0

這僅適用於存儲唯一電子郵件的情況。當用戶要求重置密碼時,您需要提供電子郵件並將令牌發送至電子郵件並將該對(電子郵件,令牌)存儲在某處。然後,當令牌回來時,您只需閱讀電子郵件,然後獲得用戶。 –

+0

是的,我只使用唯一的電子郵件,不能重複*請參閱上面的更新。 – Asynchronous

0

克里斯給出了絕對正確的解決方案。

您可以使用sql表進行令牌管理。令牌可以是唯一的UserId或Email。用於重置電子郵件的鏈接,如http://test.com/reset?id=sfksdfh-24204_23h7823。 網址中的ID是經過加密的Userid或Email,只要你喜歡。

根據Url中的id從表中獲取詳細信息。如果id包含在數據庫中。然後重置用戶的密碼。並從數據庫中刪除該令牌。

+0

Sehta,所以如果令牌在數據庫中,我如何驗證它?正如我上面所解釋的,我可以創建一個要求發送電子郵件的文本框。如果電子郵件與用戶記錄匹配,則會從數據庫中獲取令牌並通過電子郵件發送給用戶。現在; a)我使用哪種方法可以讓密碼發生變化,以及如何驗證令牌? – Asynchronous

+0

解密令牌。從Db acc獲取令牌詳細信息。到UserId或Email,即包含在URL中。如果此令牌與來自url的令牌匹配。授予更改密碼的權限。使用電子郵件從數據庫獲取Memebership詳細信息。並使用ChangePassword方法。 –

相關問題