ASP.NET 2.0 Login、CreateUserWizard、PasswordRecovery 等會員控制項內建豐富功能,但預設行為常不符實務需求。本文針對三大常見問題提供解決方案:密碼複雜度過高、找回密碼無法寄信、自訂郵件範本。
使用 CreateUserWizard 註冊時,明明輸入相同密碼卻顯示「密碼不符」。實際上預設 SqlMembershipProvider 要求:
錯誤訊息誤導,實為 MembershipCreateStatus.InvalidPassword。
<system.web>
<membership defaultProvider="SqlMembershipProvider">
<providers>
<clear />
<add name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
minRequiredPasswordLength="4" <-- 降低至 4 碼
minRequiredNonalphanumericCharacters="0" <-- 不強制特殊符號
passwordStrengthRegularExpression="" <-- 移除正則限制
/>
</providers>
</membership>
</system.web>
調整後密碼僅需 4 碼以上任意字元,符合大多數簡易系統需求。高安全性系統請保持預設或自訂 passwordStrengthRegularExpression。
ASP.NET 2.0 郵件設定不在 Web.config,而在 machine.config(全機器)或 Web.config 的 <system.net><mailSettings> 區段。預設無 SMTP 設定導致寄信失敗。
方法 A:machine.config(影響全機器應用程式)
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="noreply@yourdomain.com">
<network host="smtp.yourdomain.com" port="25"
userName="smtp_user" password="smtp_pass"
enableSsl="false" />
</smtp>
</mailSettings>
</system.net>
</configuration>
方法 B:Web.config(僅影響單一應用程式,推薦)
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="noreply@yourdomain.com">
<network host="smtp.gmail.com" port="587"
userName="your@gmail.com" password="app_password"
enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
</configuration>
注意:Gmail 需開啟「低安全性應用程式存取」或使用應用程式密碼。
新增 ~/EmailTemplates/PasswordRecovery.txt:
親愛的使用者 <%UserName%>,
您要求重設密碼。您的新密碼為:<%Password%>
請立即登入系統並變更密碼:
<%= System.Web.Security.Membership.GetUser("<%UserName%>").GetChangePasswordUrl() %>
若非您本人操作,請忽略此信。
--
系統管理團隊
可用標記:<%UserName%>、<%Password%>(僅限 passwordFormat="Clear" 或 Encrypted 時可用;Hashed 時無法取得明文密碼,需改寄重設連結)。
<asp:PasswordRecovery ID="PasswordRecovery1" runat="server">
<MailDefinition
BodyFileName="~/EmailTemplates/PasswordRecovery.txt"
Subject="您的密碼重設通知"
From="noreply@yourdomain.com"
Priority="High" />
</asp:PasswordRecovery>
<system.web>
<membership>
<providers>
<add ... passwordFormat="Hashed" />
</providers>
</membership>
</system.web>
<system.web>
<mailSettings> ... </mailSettings>
</system.web>
passwordFormat="Hashed" 時 <%Password%> 為空。建議:
ResetPassword.aspx 頁面,接收 token 參數驗證並允許設定新密碼。請點擊以下連結重設密碼:https://yoursite/ResetPassword.aspx?token=<%ResetToken%>。MembershipProvider 覆寫 GeneratePasswordResetToken、ValidatePasswordResetToken,或使用 ASP.NET Identity / ASP.NET Core Identity 內建流程。| 錯誤現象 | 可能原因 | 解決方向 |
|---|---|---|
| 郵件不發送、無錯誤訊息 | SMTP 設定錯誤、防火牆阻擋 25/587 port | Telnet 測試 SMTP、檢查事件檢視器、啟用 System.Net 追蹤 |
| 郵件進垃圾桶 | 無 SPF/DKIM/DMARC、發件人信譽低 | 設定網域 DNS 記錄、使用專業郵件服務 |
| 重設密碼連結失效 | Token 過期、機器金鑰變更導致驗證失敗 | 設定 <machineKey> 固定驗證金鑰、調整 Token 有效期限 |
| CreateUserWizard 密碼錯誤訊息不顯示 | 控制項 DisplaySideBar="false" 或自訂模板遺漏 Literal | 檢查模板內 ID="FailureText" 的 Literal 控制項 |
Login 系列控制項功能強大但預設值偏向高安全性。調整 Web.config 密碼原則、正確設定 system.net/mailSettings、善用 MailDefinition.BodyFileName 自訂範本,即可滿足多數實務需求。現代專案建議遷移至 ASP.NET Core Identity,提供更彈性的密碼策略、雙因子驗證、外部登入整合。