【问题标题】:Altering the message sent by asp:PasswordRecovery email without loosing the password/username在不丢失密码/用户名的情况下更改 asp:PasswordRecovery 电子邮件发送的消息
【发布时间】:2015-02-10 14:05:18
【问题描述】:

我的 Web 应用程序上有一个 ASP PasswordRecovery 控件,该控件在密码恢复成功后发送一封电子邮件,其中包含一小段文本,然后是用户名和新重置的密码。

我需要将短文本制作成双语,所以我在后面的代码中添加了以下内容:

protected void PasswordRecovery1_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.IsBodyHtml = false;
    string body = "translated text" + Environment.NewLine + "english text";                            

    e.Message.Body = body;
    e.Message.Subject = ConfigurationManager.AppSettings["Subject"];
}

然后发生的事情是翻译文本通过,但用户名和密码现在丢失了。

所以我尝试将它添加到我的身体中:

string pw = Membership.GetUser(PasswordRecovery1.UserName).GetPassword(PasswordRecovery1.Answer);
            string p = PasswordRecovery1.UserName;

我收到了这条消息:

此会员资格提供程序尚未配置为支持密码 检索。

所以我在控件中添加了这个:

enablePasswordRetrieval="true"

但我仍然收到同样的信息。我做错了什么?

【问题讨论】:

  • 启用密码检索可能不是你想要的,因为它改变了密码管理的一些重要行为。 (也就是说,密码不应该是可恢复的。使它们可恢复打破了这一点。)如果您确实想要这样做,则必须在成员资格提供程序而不是控件上执行此操作。可能在Web.config。相反,在覆盖之前尝试检查 e.Message.Body 中已经存在的值。也许你可以改变现有的价值而不是创造一个全新的价值?
  • 密码检索只有在密码没有经过哈希处理的情况下才是一种选择。您的会员密码格式是什么?
  • e.Message.Body 包含带有用户名和密码的标准消息,我只想处理用户名和密码并将文本更改为我自己的偏好
  • 是的,我的密码格式是散列的
  • 没有很好的文档记录,但是PasswordRecovery 控件有一个MailDefinition 属性。这返回的对象有一个名为BodyFileName 的属性,它应该是一个文件,它将被读取并用作电子邮件的正文。真正隐藏的功能是它将在该正文中对<% UserName %><% Password %> 进行一些替换。我自己没有尝试过,但可能值得尝试让它工作。

标签: c# asp.net


【解决方案1】:

如果您的会员资格被配置为散列,则密码检索将被禁用。

如果在 ASP.NET 应用程序的 Web.config 文件中将 enablePasswordRetrieval 设置为 true 并且 passwordFormat 设置为 Hashed,则会引发 ConfigurationException。

https://msdn.microsoft.com/en-us/library/2x0c6sfa%28v=vs.110%29.aspx

如果是这种情况,您应该将新密码存储在一个字符串中,然后使用ChangePassword() 函数将其保存到数据库中。

我的工作方式如下:

MembershipUser user = Membership.GetUser("username"); // or however you want to retrieve the MembershipUser object
string password = Membership.GeneratePassword(12, 0); // generate a new password
bool changePasswordSucceeded = user.ChangePassword(user.ResetPassword(), password); // reset the password

if(changePasswordSucceeded)
{
    // email logic here
}

【讨论】:

  • 更改密码功能不起作用,我得到:“值不能为空。参数名称:passwordAnswer”
  • 然后获取密码答案并使用其他ChangePassword 重载。如果您想要更好的答案,请在您的 web.config 中提供成员资格提供商定义。需要它,因为您没有提供您为成员资格定义的任何要求。
【解决方案2】:

我把这件事搞得太复杂了。

根据 Damien 的评论,您可以通过创建自己的 PasswordReset.txt 文件轻松解决此问题,例如:

翻译的消息

用户名的翻译词: 用户名的翻译词 密码:

英文留言

用户名: 密码:

然后只需转到 PasswordRecovery 属性框并将 MailDefinition-BodyFileName 指向您的文件。

只要你有上面的标签,控件就会为你换掉用户名和密码。

无需在后面的代码中搞乱发送邮件事件。

希望这对某人有所帮助。

【讨论】:

  • 我不是那个投反对票的人,但是首先将密码未加密然后以纯文本形式通过电子邮件发送密码似乎非常不安全? ...当然“密码重置”更可取,一旦密码丢失,只需确保可以验证用户,然后允许他们更改密码?
  • @BenjaminPaul - 这是用于密码重置功能,其中新生成的重置密码被发送给用户 - 而不是他们的原始密码(这是不可恢复的,因为它已被散列)
猜你喜欢
  • 2011-02-08
  • 2020-02-10
  • 2014-08-20
  • 2017-08-13
  • 2014-01-01
  • 2019-11-24
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多