Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 WebSecurity.ChangePassword在什么时候失败;新密码无效";?_Asp.net Mvc 4_Security_Simplemembership - Fatal编程技术网

Asp.net mvc 4 WebSecurity.ChangePassword在什么时候失败;新密码无效";?

Asp.net mvc 4 WebSecurity.ChangePassword在什么时候失败;新密码无效";?,asp.net-mvc-4,security,simplemembership,Asp.net Mvc 4,Security,Simplemembership,这是在MVC 4中构建的默认AccountController中更改密码的代码: // ChangePassword will throw an exception rather //than return false in certain failure scenarios. bool changePasswordSucceeded; try { string userName = User.Identity.Name; changePasswordSucceeded

这是在MVC 4中构建的默认AccountController中更改密码的代码:

// ChangePassword will throw an exception rather 
//than return false in certain failure scenarios.
bool changePasswordSucceeded;
try
{
    string userName = User.Identity.Name;    
    changePasswordSucceeded = WebSecurity.ChangePassword(userName, 
                                                         model.OldPassword,
                                                         model.NewPassword);
}
catch (Exception)
{
    changePasswordSucceeded = false;
}

if (changePasswordSucceeded)
{
    return RedirectToAction("Manage", new { Message = ManageMessageId.ChangePasswordSuccess });
}
else
{
    ModelState.AddModelError("",
    "The current password is incorrect or the new password is invalid.");
}
我的问题是,信息不清楚。如果当前密码不正确,那没关系,但如果新密码无效,我希望向用户提供更好的消息,告诉他们哪里出了问题,并且我希望更好地理解“失败场景”,以便我可以定制消息

文档中详细说明了异常情况,我认为不应在操作中忽略这些异常,并将其报告为无效密码

那么,为什么这里可能出现“新密码无效”的情况呢?如果在应用程序中仅使用SimpleMembershipProvider而不使用OAuth,是否可以删除它

编辑:NB此数据注释也出现在“RegisterModel”类中,因此这里也有密码有效性检查

[StringLength(100, 
ErrorMessage = "The {0} must be at least {2} characters long.", 
MinimumLength = 6)]
总结 这是一个很长的答案,所以我把它编辑成了几个部分。与这样的用户相比,我不是一个安全专家,甚至他也说不要相信他的安全答案,或者其他任何人的。自己测试并理解它,永远。任何阅读本文的web开发人员都应该阅读、使用在线指导,当然,还有。安全性对于我们中的任何一个人来说都是复杂和太大的,所以请使用能够根据最佳实践进行工作的框架。最重要的是,保留一切

有关这些摘要答案的更多详细信息,请参见下文:

  • 发送给用户的消息故意含糊不清,可以认为这是出于安全原因(见下文)
  • 参考“故障场景”,它们主要是由于模型验证已经捕捉到的无效输入、错误的当前密码或边缘案例异常造成的
  • 由于最初的开发人员懒惰,或者因为他们认为所有情况都应该有一个单一的返回消息,所以这些异常被吞并并呈现为一个异常(参见上面的1)
  • 只要属性匹配,“新密码无效”可能不适用于您突出显示的代码,或者比ChangePassword中的长度限制更严格。但是,请参见上文(1)
  • 我可以移除它吗?见上文第(1)段
  • 好的观点,请参见下面的讨论
  • 原始答案-概念攻击向量 从安全角度考虑:

    • 我走到你的手机/平板电脑/笔记本电脑旁,坐在酒吧/咖啡厅的桌子上(或家里/办公室的台式电脑上)
    • 我想我可能知道你的密码
    • 我进入“更改密码”并键入我认为您的密码不正确的内容
    • 我故意输入了一个1个字符的新密码
    机器告诉我

    “当前密码不正确”

    现在,我输入了我认为您当前的密码,请重试:

    “新密码无效”

    我现在知道你的密码,但你不知道我知道,因为我没有更改任何东西

    脚注:我把第一组逻辑搞错了,删除了,编辑了,重新发布了,但是嘿-

    类似的攻击 这种攻击有很多种组合,但它就像从一个糟糕的登录系统中获取电子邮件一样。想一想,当我尝试使用电子邮件地址“恢复密码”时,如果收到两条不同的消息,会发生什么情况:

    • 已将电子邮件发送到您的地址(对于数据库中的电子邮件)
    • 找不到您的电子邮件(显然是伪造的电子邮件地址)
    然后,我可以很容易地从你的网站上找到有效的成员电子邮件,对该用户进行有针对性的网络钓鱼攻击,或者只是建立一个有效的垃圾邮件电子邮件地址列表

    可能的解决办法 在这两种情况下,对于我们的密码更改,一个更加用户友好但同样安全的错误消息是:

    当前密码不正确或新密码无效。请记住,您的密码区分大小写,新密码必须有[/3个希腊神的名字]

    为了保持理智,请在应用程序使用的上下文中保持这一点,但请记住,在一个更大的生态系统中,无论您喜欢与否,您都负有责任

    ChangePassword何时返回false? 关于ChangePassword何时返回false的问题部分:

    本质上是
    WebSecurity.ChangePassword

    总之,如果出现以下情况,则返回
    false

  • 任何参数均未通过null、空或长度检查;或
  • 数据库连接失败;或
  • UserId
    不再存在于数据库中;或
  • 当前密码不正确;或
  • (显然,如果发生任何其他异常,它将设置
    changepasswordsucceed=false
  • 调用
    ChangePassword
  • 因此,从理论上讲,如果您正确地设置了验证属性,并且忽略了边缘情况,那么只有当我们有边缘情况时(在Get和Post之间,用户已被删除,或者我们无法访问数据库,或者当前密码无效),它才能
    返回false

    即使在攻击者绕过浏览器中的UI(他们将绕过)的情况下,这一切都是正确的,因为操作本身在模型上调用
    IsValid

    客户端消息 这里有一个严肃的免责声明:我不会把我的一生都花在安全上。我遵循“按设计安全”原则(例如,我遵守这些原则),并且相信我对最重要的安全原则有很好的认识。因此,我可能有一些逻辑错误

    如果客户端“密码要求”验证不存在-会发生什么?用户必须等待帖子返回以了解发生了什么

    如果存在客户端“密码要求”验证,是否会削弱我们的界面?我不这么认为

    • 服务器仍然执行要求和当前密码验证
    • 服务器不支持远程通信