使用表单身份验证获取当前用户id(而非名称)
本文关键字:id 用户 表单 身份验证 获取 | 更新日期: 2023-09-27 18:11:07
问题:
我在玩表单身份验证和我自己的自定义会员资格提供商。
据我所见,我可以通过以下操作获得当前的FormsIdentity:
System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity)
System.Web.HttpContext.Current.User.Identity;
我可以让当前的会员用户这样做:
var UserFromDb = System.Web.Security.Membership.GetUser();
然后我可以通过以下操作获取用户ID:
var MyUserId = UserFromDb.ProviderUserKey;
我觉得有趣的是,当我打电话给会员时。GetUser((,然后它在成员资格提供程序中调用此方法
public override MembershipUser GetUser(string username, bool userIsOnline)
它在数据库中查找用户信息
所以我想的是。NET框架内部做
GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever);
其基于USERNAME从数据库获取用户信息。我觉得这很令人不安,首先是因为当我必须查找整个用户才能获得userid时,这对性能不利。
其次,我不得不查找userid,这让我很不安,因为这不是我所期望的。
第三,这很令人不安,因为用户名可以在程序过程中更改,而让用户必须注销并登录才能更改用户名是无稽之谈。
现在,对我来说,这个设计听起来像是无稽之谈
但话说回来,微软还使用应用程序名、组名和用户名作为主键,这也没有多大意义
所以我的问题是:
难道没有一种方法可以在不查找数据库的情况下获得用户ID吗
还是整个会员制提供商的想法在设计上被打破了?
如果它坏了:
我看到FormsIdentity有一个名为userdata的字符串属性。如果是,我如何使用ASP。NET将用户ID保存在那里?
是的,可以从这里找到解决方法
可以在Auth cookie Ticket UserData中设置UserId。
public class UserData
{
public string FirstName { get; set; }
public UserData()
{
FirstName = "Unknown";
}
} // End Class UserData
public void SignIn(string userName, bool createPersistentCookie)
{
if (String.IsNullOrEmpty(userName))
throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName");
UserData userData = new UserData();
SetAuthCookie(userName, createPersistentCookie, userData);
//FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
}
public void SetAuthCookie(string userName, bool createPersistentCookie, UserData userData)
{
HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie);
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration
,ticket.IsPersistent, userData.ToJSON(), ticket.CookiePath
);
string encTicket = FormsAuthentication.Encrypt(newTicket);
cookie.Value = encTicket;
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
} // End Sub SetAuthCookie
另一种可能性是只使用UserId。ToString((作为"name"。