5

问题:

我正在玩表单身份验证和我自己的自定义会员提供程序。

据我所知,我可以通过以下方式获得当前的 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 保存在那里?

4

1 回答 1

2

是的,可以从这里找到解决方法。
可以在 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() 作为“名称”。

于 2013-04-26T20:12:22.263 回答