问题:
我正在玩表单身份验证和我自己的自定义会员提供程序。
据我所知,我可以通过以下方式获得当前的 FormsIdentity:
System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity)
System.Web.HttpContext.Current.User.Identity;
我可以让当前的会员用户这样做:
var UserFromDb = System.Web.Security.Membership.GetUser();
然后我可以通过这样做来获取用户标识:
var MyUserId = UserFromDb.ProviderUserKey;
我觉得有趣的是,当我调用 Membership.GetUser() 时,它会在成员资格提供程序中调用此方法
public override MembershipUser GetUser(string username, bool userIsOnline)
它在数据库中查找用户信息。
所以我认为 .NET 框架在内部可以做到
GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever);
它根据 USERNAME 从数据库中获取用户信息。我觉得这很令人不安,首先是因为当我必须查找整个用户来获取用户 ID 时,这对性能不利。
其次,令人不安的是我必须查找用户 ID,因为这不是我所期望的。
第三,这很令人不安,因为用户名可以在程序的过程中更改,并且让用户必须注销并登录才能这样做是无稽之谈。
现在,对我来说,这个设计听起来像是胡说八道。
不过话说回来,微软也用应用名、组名和用户名作为主键,这也确实没有多大意义。
所以我的问题是:
有没有办法在没有数据库查找的情况下获取用户 ID?
还是整个会员提供者的想法都被设计破坏了?
如果它这么坏:
我看到 FormsIdentity 有一个名为 userdata 的字符串属性。如果是这样,我如何使用 ASP.NET 将用户 ID 保存在那里?