Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
Security .NET Web API密码重置_Security_Authentication_Passwords_Asp.net Web Api_Reset Password - Fatal编程技术网

Security .NET Web API密码重置

Security .NET Web API密码重置,security,authentication,passwords,asp.net-web-api,reset-password,Security,Authentication,Passwords,Asp.net Web Api,Reset Password,当用户忘记密码时,你不应该通过电子邮件发送。Troy Hunt在他的Pluralsight课程中指出,SMTP上没有隐含的传输层安全性。在信息安全协议栈上,Exchange确认在明文中发送或存储密码(包括通过电子邮件)是个坏主意 重置密码的正确方法似乎是不要立即重置密码。相反,通过电子邮件向用户发送有时间限制的激活链接。这需要用户手动干预,并且在任何阶段都不会通过电子邮件传递密码 上述内容描述了如何实现密码重置机制: 无论发生什么情况,都不要重置用户的密码-“重置”密码对用户来说更难记住,这意味

当用户忘记密码时,你不应该通过电子邮件发送。Troy Hunt在他的Pluralsight课程中指出,SMTP上没有隐含的传输层安全性。在信息安全协议栈上,Exchange确认在明文中发送或存储密码(包括通过电子邮件)是个坏主意

重置密码的正确方法似乎是不要立即重置密码。相反,通过电子邮件向用户发送有时间限制的激活链接。这需要用户手动干预,并且在任何阶段都不会通过电子邮件传递密码

上述内容描述了如何实现密码重置机制:

无论发生什么情况,都不要重置用户的密码-“重置”密码对用户来说更难记住,这意味着用户必须更改密码或将其写下来,例如,将其张贴在显示器边缘的亮黄色标签上。取而代之的是,让用户立即选择一个新的,这也是他们想要做的

如果用户忘记了密码,请使用存储在数据库中的随机生成的重置令牌向他们发送一个安全的一次性重置链接。令牌必须是唯一和机密的,因此在数据库中散列令牌,并在使用链接时进行比较

类似地描述了实现:

始终在数据库中散列丢失的密码代码/令牌。同样,此代码是另一个与密码等效的示例,因此必须对其进行哈希处理,以防攻击者侵入您的数据库。当请求丢失密码时,将明文代码发送到用户的电子邮件地址,然后对其进行散列,将散列保存在数据库中,并丢弃原始密码。就像密码或持久登录令牌一样

但是用户如何知道新密码呢。它是否重置为某个默认值?是否将其更改为需要以某种方式与用户通信的随机生成的密码

在中,激活链接将带您进入一个表单,您可以在其中输入新密码

如果您处理的是一个网站,您可以进入该网站并与web应用程序交互,然后选择自己的新密码,那么这可能没问题。但是使用类似.NETWebAPI的东西,您与控制器上的操作进行交互,这些控制器通常应该为您提供数据,而不是用户界面。你不能只是给他们一个链接,然后期望他们用它做点什么


因此,如果您处理的是通过Web API的身份验证,那么什么是一种有效且安全的方法来允许用户重置密码并向他们传达新密码?

在这个问题中,您要解决两个概念:密码重置和涉及的机制,以及通过Web API对用户进行身份验证的正确方法。我认为区分它们并首先理解后者是很重要的

假设您有一个web应用程序和一个受保护的资源web API。web API要求所有调用方必须通过某种机制进行身份验证。允许用户对web API进行身份验证的一种方法是直接向web API提供凭据,但这会带来许多其他问题,例如web API需要存储/维护/访问用户帐户信息,以这种方式沿线路发送密码的安全弱点,web API在获取用户原始凭证时必须代表用户的广泛范围,等等

您可能听说过OAuth2.0,它解决了这些问题。访问受保护资源web API的更好方法是添加授权层。例如,web应用程序会显示一个对话框,用于输入用户的凭据,然后将其发送到授权服务器并进行验证,从而生成访问令牌。然后,访问令牌可用于代表用户或代表使用客户端凭据授权的应用程序对web API的调用进行身份验证。使用此流,web API不需要直接对用户进行身份验证,它可以更加轻量级,并且可以解决其他流的许多其他安全问题。有关更多详细信息,请参阅


回到您的示例,更好的答案是在不同级别管理密码重置。您的web API根本不需要知道用户和密码,让我们单独重置它-它应该只接收一个令牌并验证它。这允许您使用所需的密码重置方法,并且不会影响对任何下游资源的访问。

在这个问题中,您要解决两个概念:密码重置和涉及的机制,以及对用户进行web API身份验证的正确方法。我认为区分它们并首先理解后者是很重要的

假设您有一个web应用程序和一个受保护的资源web API。web API要求所有调用方必须通过某种机制进行身份验证。允许用户对web API进行身份验证的一种方法是直接向web API提供凭据,但这会带来许多问题 其他问题,如需要存储/维护/访问用户帐户信息的web API、以这种方式沿线路发送密码的安全弱点、web API在获取用户原始凭证时必须代表用户的广泛范围等

您可能听说过OAuth2.0,它解决了这些问题。访问受保护资源web API的更好方法是添加授权层。例如,web应用程序会显示一个对话框,用于输入用户的凭据,然后将其发送到授权服务器并进行验证,从而生成访问令牌。然后,访问令牌可用于代表用户或代表使用客户端凭据授权的应用程序对web API的调用进行身份验证。使用此流,web API不需要直接对用户进行身份验证,它可以更加轻量级,并且可以解决其他流的许多其他安全问题。有关更多详细信息,请参阅


回到您的示例,更好的答案是在不同级别管理密码重置。您的web API根本不需要知道用户和密码,让我们单独重置它-它应该只接收一个令牌并验证它。这允许您使用所需的密码重置方法,并且不会影响对任何下游资源的访问。

在此场景中需要记住的是,Web API只是一个API。尽管可能没有网站,但在某个地方仍然有一个用户界面—实际的网站、WPF应用程序或移动应用程序—并不重要。因此,通常的安全忘记密码功能仍然可以实现

然而,有一个区别。不要发送链接,而是发送令牌本身。然后,UI提供输入令牌的位置。下面是要执行的步骤:

想要重置密码的用户进入UI中相应的忘记密码屏幕。 系统将提示用户输入其用户名。 令牌以明文形式发送到其关联的电子邮件地址。散列版本与到期日(例如,从现在起一小时)一起存储在数据库中。 用户在下一个屏幕中输入令牌。 如果令牌有效,用户将进入一个屏幕,在该屏幕中,他可以输入新密码,而不必输入旧密码-令牌已经对他进行了身份验证。
通过电子邮件发送明文令牌可能听起来有点像通过电子邮件发送密码。然而,它在短时间后过期的事实给了攻击者一个非常小的机会来使用它。此外,令牌是一次性的,在使用时会被丢弃。

在这个场景中要记住的是,Web API只是一个API。尽管可能没有网站,但在某个地方仍然有一个用户界面—实际的网站、WPF应用程序或移动应用程序—并不重要。因此,通常的安全忘记密码功能仍然可以实现

然而,有一个区别。不要发送链接,而是发送令牌本身。然后,UI提供输入令牌的位置。下面是要执行的步骤:

想要重置密码的用户进入UI中相应的忘记密码屏幕。 系统将提示用户输入其用户名。 令牌以明文形式发送到其关联的电子邮件地址。散列版本与到期日(例如,从现在起一小时)一起存储在数据库中。 用户在下一个屏幕中输入令牌。 如果令牌有效,用户将进入一个屏幕,在该屏幕中,他可以输入新密码,而不必输入旧密码-令牌已经对他进行了身份验证。
通过电子邮件发送明文令牌可能听起来有点像通过电子邮件发送密码。然而,它在短时间后过期的事实给了攻击者一个非常小的机会来使用它。此外,代币是一次性的,在使用时会被丢弃。

您提出了好的观点,但与问题并不完全相关。可能是我的错,因为我没有说明具体情况;然而,我的工作假设Web API已经通过SSL、HMAC令牌和其他非OAuth的东西实现了安全,您只需要为用户提供一种机制来重置其密码并将该密码传递给他。我可能误解了您的要求。我的回答是试图建议您重新考虑让web API进行身份验证并完全重置密码,这从本质上改变了问题的性质。您的意思是希望用户能够直接对web API进行身份验证,而不需要客户端应用程序,并且web API也能够重置其密码吗?是的。。。尽管总是需要一个客户端应用程序来与web API通信,但本质上我希望web API能够处理身份验证和密码重置。我可能已经知道怎么做了。。。我将在未来几天内尝试一个实现,如果它有效的话,我会发布一个答案
这不是很好的观点,但与问题并不完全相关。可能是我的错,因为我没有说明具体情况;然而,我的工作假设Web API已经通过SSL、HMAC令牌和其他非OAuth的东西实现了安全,您只需要为用户提供一种机制来重置其密码并将该密码传递给他。我可能误解了您的要求。我的回答是试图建议您重新考虑让web API进行身份验证并完全重置密码,这从本质上改变了问题的性质。您的意思是希望用户能够直接对web API进行身份验证,而不需要客户端应用程序,并且web API也能够重置其密码吗?是的。。。尽管总是需要一个客户端应用程序来与web API通信,但本质上我希望web API能够处理身份验证和密码重置。我可能已经知道怎么做了。。。我将在未来几天内尝试一个实现,如果可行,我将发布一个答案。