2013-12-23 28 views
0

我想通過在我的asp.net 4.0應用程序中註冊他們的電子郵件ID,密碼和確認密碼來允許他人。我怎樣才能將確認鏈接發送到他們輸入的電子郵件,並通過在個人資料中顯示個人資料強度?與後端作爲sql server 2010在ASP.Net應用程序中發送電子郵件確認鏈接

回答

0

您必須發送具有唯一確認ID的確認鏈接作爲鏈接中的查詢字符串參數。當用戶點擊該鏈接時,您可以驗證該鏈接 -

  1. 鏈接已被使用?
  2. 鏈接是否有有效的確認號碼。

然後如果它是有效的鏈接,然後允許用戶確認那裏的電子郵件ID。唯一的確認ID需要存儲在數據庫中給定的電子郵件ID。所以你可以驗證它。同樣在同一個數據庫表中,您可以在附加字段中記錄生成該標識和發送給用戶的電子郵件時的時間戳。

+0

感謝ü烏拉圭回合的反應。但我使用SQL Server作爲後端。所以時間戳會在SQL中工作? – sandesh

0

介紹

身份驗證和授權的Web應用程序的作爲基本組成部分與.NET 2.0到達被大大簡化。基本認證和授權可以使用不同的DBMS系統來執行。有很多使用Access數據庫實現身份驗證的示例。在使用Access數據庫的ASP.NET 2.0身份驗證文章中可以找到一個這樣的示例。在本文中,該示例實現了最低限度的目標,即使用訪問數據庫進行身份驗證和授權。但是,認證和授權只是用戶管理系統的第一部分。用戶管理的第二個基本部分是允許用戶隨意創建賬戶。在這種情況下,用戶可以註冊併成爲社區成員,無需管理員干預。此外,用戶應該能夠提供聯繫信息(電子郵件),以便在必要時聯繫他/她。聯繫信息必須經過驗證。本文重點介紹實現此目標的非常簡單的方法。

的CreateUserWizard

正如已經懷疑,.NET 2.0提供了必要的工具進行快速和有效地執行用戶註冊。感興趣的組件是可以在Login組件下找到的CreateUserWizard控件。 CreateUserWizard組件提供預先格式化的一組組件,爲用戶提供輸入必要信息的機會。默認情況下,CreateUserWizard爲用戶提供了輸入名稱,密碼,電子郵件,安全問題以及回答安全問題的選項。另外,CreateUserWizard爲用戶提供重新輸入密碼以確認用戶意圖的功能。

在我們的示例中,我們將重點介紹實現用戶註冊和電子郵件確認的簡約方法。因此,我們不會實施安全問題,而是關注用戶名,密碼和電子郵件以進行確認。本文繼續使用Access數據庫進行ASP.NET 2.0授權,並重復使用該文章中介紹的角色和成員資格提供程序代碼。在這裏,我只會介紹上述文章的補充內容。此外,還包含完整的源代碼,演示部分可以找到演示。

擴展角色和會員供給者

如前所述,我將重點介紹必要的CreateUserWizard執行額外的實施。在ASP.NET 2中實現的方法。在上面的文章中解釋了使用Access數據庫的0認證和授權。但是,有些修改會在相關時間強調。

看着AccessMembershipProvider,我很快意識到有多種方法必須實現才能正確使用CreateUserWizardcontrol。首先,我們需要能夠消除安全問題選項。爲了消除安全問題,成員資格提供程序的RequiresQuestionAndAnswer屬性必須返回false。這個屬性的實現類似於連接字符串屬性的實現。我們只需添加從Web配置文件中檢索其值的變量bool。 Web配置文件必須包含requiresQuestionAndAnswer如下圖所示:

<membership defaultProvider="AccessMembershipProvider"> 
<providers> 
<clear/> 
<add name="AccessMembershipProvider" 
type="AccessProvider.AccessMembershipProvider" 
connectionStringName="UsersDB" 
requiresQuestionAndAnswer="false"/> 
</providers> 
</membership> 

而設置初始化方法中解析如下:

public override void Initialize(string name, 
System.Collections.Specialized.NameValueCollection config) 
{ 
base.Initialize(name, config); 
m_strDBConnection = 
ConfigurationManager.ConnectionStrings[config["connectionStringName"]].ConnectionString; 
m_bRequiresQuestionAndAnswer = 
(config["requiresQuestionAndAnswer"].ToLower().CompareTo("true") == 0); 
} 

我們可以看到,上面簡單的代碼從網絡提取設置.config文件並將其應用於相應的屬性。 CreateUserWizard控件讀取相同的屬性並根據屬性值顯示安全問題。既然不需要輸入安全問題,我們可以查看用戶輸入數據並嘗試創建用戶時會發生什麼。通過實驗,我意識到AccessMembershipProvider方法CreateUser被調用(顯然)。直覺上,我斷定這個方法負責將用戶添加到數據庫的代碼。以下是方法實現:

公衆覆蓋的MembershipUser CREATEUSER(用戶名字符串,字符串密碼,串電子郵件,

string passwordQuestion, string passwordAnswer, 
bool isApproved, object providerUserKey, 
out MembershipCreateStatus status) 
{ 
MembershipUser user = null; 
using (OleDbConnection conn = new OleDbConnection(m_strDBConnection)) 
{ 
try 
{ 
OleDbCommand command = new OleDbCommand("INSERT INTO Users " + 
"(UUSERNAME, UPASSWORD, EMAIL, PROVIDER_KEY) "+ 
"VALUES (@Param1, @Param2, @Param3, @Param4)", 
conn); 
Guid guid = Guid.NewGuid(); 
command.Parameters.AddWithValue("@Param1", username); 
command.Parameters.AddWithValue("@Param2", password); 
command.Parameters.AddWithValue("@Param3", email); 
command.Parameters.AddWithValue("@Param4", guid.ToString()); 
conn.Open(); 
command.ExecuteNonQuery(); 
string[] users = {username}; 
Roles.AddUsersToRole(users, "User"); 
conn.Close(); 
user = new MembershipUser("AccessMembershipProvider", 
username, guid, email, null, null, false, false, 
DateTime.Now, DateTime.Now, DateTime.Now, 
DateTime.Now, DateTime.Now); 
status = MembershipCreateStatus.Success; 
} 
catch (Exception ex) 
{ 
System.Diagnostics.Trace.WriteLine(ex.Message); 
status = MembershipCreateStatus.UserRejected; 
} 
} 
return user; 
} 

CREATEUSER方法只是將用戶添加到數據庫,並在進入返回充滿信息MembershipUser對象CreateUserWizard這個方法的第一次實現並沒有包括使用角色提供者將用戶添加到「User」組中,但是後來的調查顯示,用戶只是簡單地添加了,沒有分配任何組件,意識到用戶必須在一個組中,將以下實現添加到AccessRoleProvider代碼中:

public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
{ 
using (OleDbConnection conn = new OleDbConnection(m_strDBConnection)) 
{ 
try 
{ 
for (int i = 0; i < usernames.Length; ++i) 
{ 
OleDbCommand command = new OleDbCommand("INSERT INTO UsersInRoles "+ 
"(ROLE_NAME, UUSERNAME) "+ 
"VALUES (@Param1, @Param2)", 
conn); 
command.Parameters.AddWithValue("@Param1", roleNames[i]); 
command.Parameters.AddWithValue("@Param2", usernames[i]); 
conn.Open(); 
command.ExecuteNonQuery(); 
conn.Close(); 
} 
} 
catch (Exception ex) 
{ 
System.Diagnostics.Trace.WriteLine(ex.Message); 
} 
} 
} 

現在,用戶被添加到數據庫並分配到適當的組,我們需要實現代碼來確認用戶信息,特別是電子郵件。通過MSDN文檔搜索,我發現CreateUserWizard提供了自動發送電子郵件通知的方法。然而,由於缺乏活動內提供的信息,這種做法並不合適。我們的構想將利用創建用戶時寫入數據庫的GUID。只有在執行使用此GUID的激活時,用戶纔會被激活。使用發送電子郵件事件找出GUID是不切實際的,找到了更簡單的解決方案,即CreateUserWizard組件的CreatedUser事件。

電子郵件通知

前面已經提到的,用戶應該能夠後才成功的電子郵件構象使用的帳戶。爲了確認,用戶應該收到一封電子郵件,其中包含會自動激活帳戶的鏈接。一旦賬戶被激活,該賬戶即可使用。以下是CreatedUser事件執行:

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e) 
{ 
CreateUserWizard wizard = (CreateUserWizard)sender; 
MembershipUser user = Membership.GetUser(wizard.UserName); 
if (user != null) 
{ 
try 
{ 
SmtpClient smtpClient = new SmtpClient("smtpServer"); 
smtpClient.UseDefaultCredentials = true; 
smtpClient.Send("yourEmail", user.Email, "Account Conformation Email", 
"hst/Confirm.aspx?id="+user.ProviderUserKey.ToString()); 
} 
catch (Exception ex) 
{ 
System.Diagnostics.Trace.WriteLine(ex.Message); 
} 
} 
} 

電子郵件通知的實現非常簡單。這是由於.NET庫提供了與任何SMTP服務器通信的非常簡單的方法。注意smtpClient.UseDefaultCredentials = true行很重要。通過這種方式,smtpClient對象查看web.config中的SMTP服務器設置,即用戶名,密碼和要使用的主機。下面的部分是由SmtpClient對象預期存在於web.config文件:

<system.net> 
<mailSettings> 
<smtp> 
<network 
host="smtp.hst.com " 
userName="username" 
password="password" /> 
</smtp> 
</mailSettings> 
</system.net> 

設置是自解釋的。 smtpClient只需要使用主機名,用戶名和密碼。一旦創建用戶,就會引發CreatedUser事件併發送電子郵件。電子郵件的內容僅僅是一個帶有id參數的Confirm.aspx頁面的鏈接。 id參數是專門爲該用戶分配的GUID。需要注意的是,用戶名也可以使用,但GUID提供的安全性稍高一些。

爲使CreatedUser事件正常工作所需的另一個擴展是AccessMembershipProvider對象能夠基於用戶名提供用戶信息的能力。爲了實現這樣的功能,AccessMembershipProvider包含以用戶名作爲參數並從數據庫讀取用戶信息的方法。以下是執行:

public override MembershipUser GetUser(string username, bool userIsOnline) 
{ 
MembershipUser user = null; 
using (OleDbConnection conn = new OleDbConnection(m_strDBConnection)) 
{ 
try 
{ 
/* Create command */ 
OleDbCommand command = 
new OleDbCommand("SELECT UUSERNAME, PROVIDER_KEY, EMAIL FROM Users " + 
"WHERE [email protected]", conn); 
command.Parameters.AddWithValue("@Param1", username); 
/* Open connection */ 
conn.Open(); 
/* Run query */ 
OleDbDataReader reader = command.ExecuteReader(); 
/* Check if we have something */ 
bool bResult = reader.HasRows; 
if (bResult) 
{ 
reader.Read(); 
user = new MembershipUser("AccessMembershipProvider", reader.GetString(0), 
new Guid(reader.GetString(1)), 
reader.GetString(2), "", "", true, false, 
DateTime.Now, DateTime.Now, DateTime.Now, 
DateTime.Now, DateTime.Now); 
} 
/* Close connection */ 
conn.Close(); 
return user; 
} 
catch (Exception ex) 
{ 
System.Diagnostics.Trace.WriteLine(ex.Message); 
} 
return user; 
} 
} 

再一次,實施是微不足道的。我們只需通過針對用戶表運行查詢,即可通過指定用戶名查找有關用戶的信息

電子郵件確認

一旦發送電子郵件用戶收到帶有鏈接的電子郵件,以確認他/她的註冊和電子郵件。該鏈接的格式爲http://「hst」/Confirm.aspx?id=XXXXXXXXXXXXXXXXXX,其中XXXXXXXXXXXXXXXX是在CreateUser方法中確定的GUID。一旦用戶點擊電子郵件,瀏覽器將加載帶有適當參數的Confirm.aspx頁面。如懷疑,Confirm.aspx負責帳戶激活。帳戶激活通過修改用戶表中的ACTIVATED標誌來執行。以下是Confirm.aspx實現:

protected void Page_Load(object sender, EventArgs e) 
{ 
if (Request.QueryString["id"] != null) 
{ 
using (OleDbConnection conn = new OleDbConnection(
ConfigurationManager.ConnectionStrings["UsersDB"].ConnectionString)) 
{ 
try 
{ 
OleDbCommand command = 
new OleDbCommand("UPDATE Users SET [email protected] "+ 
"WHERE [email protected]", conn); 
command.Parameters.AddWithValue("@Param1", true); 
command.Parameters.AddWithValue("@Param2", Request.QueryString["id"]); 
conn.Open(); 
command.ExecuteNonQuery(); 
conn.Close(); 
Response.Write("Your account has been activated. "+ 
"Please log in <a href='Default.aspx'>here</a>"); 
} 
catch (Exception ex) 
{ 
System.Diagnostics.Trace.WriteLine(ex.Message); 
} 
} 
} 
} 

該實現不言自明。代碼只是用指定的GUID修改用戶的激活標誌。

在這一點上,重要的是陳述一些顯而易見的事實。 AccessMembershipProvider的ValidateUser方法必須修改以考慮激活標誌。換句話說,只有被激活的用戶可以驗證並因此記錄爲完整起見,下面是實現:

public override bool ValidateUser(string username, string password) 
{ 
using (OleDbConnection conn = new OleDbConnection(m_strDBConnection)) 
{ 
try 
{ 
/* Create command */ 
OleDbCommand command = new OleDbCommand("SELECT UUSERNAME, UPASSWORD FROM Users " + 
"WHERE [email protected] " + 
"AND [email protected] " + 
"AND [email protected]", 
conn); 
command.Parameters.AddWithValue("@Param1", username); 
command.Parameters.AddWithValue("@Param2", password); 
command.Parameters.AddWithValue("@Param3", true); 
/* Open connection */ 
conn.Open(); 
/* Run query */ 
OleDbDataReader reader = command.ExecuteReader(); 
/* Check if we have something */ 
bool bResult = reader.HasRows; 
/* Close connection */ 
conn.Close(); 
return bResult; 
} 
catch (Exception ex) 
{ 
System.Diagnostics.Trace.WriteLine(ex.Message); 
} 
return false; 
} 
} 

Access數據庫

Access數據庫利用延伸在ASP利用的數據庫的版本.NET 2.0 Forms身份驗證文章,其中增加了GUID和ACTIVATED字段。 GUID存儲在PROVIDER_KEY字段中。另外,由於與Access數據庫系統衝突,必須重新命名一些字段,如用戶名和密碼。

Source

Click here to demo

相關問題