我发现密码只能通过asp.net2.0 Membership中的方法GetPassword()来检索。
事实上,当我们从数据库获取用户信息并将其设置为用户的属性(MemberhsipUser的对象)时,我们可以获取密码,就像user.Email,user.UserName等
一样。很明显,采用第二个分辨率(属性)可以减少服务器和数据库之间的一次旅行,更方便。但为什么微软不这样做呢?出于安全原因?那么为什么将密码设置为属性不太安全?
答案 0 :(得分:1)
是的原因是安全。
此处的密码不是SecuredString(它必须是,但由于向后兼容性,它可能无法更改)。在大多数情况下,您只需要会员信息和一般信息。如果password是一个属性,它将保留在内存中,直到请求完成并且它被垃圾收集。如果多个应用程序共享主机,则可能(尽管非常不可能也很困难)另一个应用程序访问进程内存块(因为它在同一进程中运行)并获取密码。
答案 1 :(得分:0)
使用.NET Reflector查看反射...
我发现GetPassword方法是一种虚方法,可以被提供者轻松覆盖。这就是你不使用Property开始的原因。
public virtual string GetPassword()
{
return Membership.Providers[this.ProviderName].GetPassword(this.UserName, null);
}
哦,当然还有安全性!