使用表单身份验证获取当前用户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保存在那里?

使用表单身份验证获取当前用户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"。