使用表单身份验证获取当前用户ID(而不是名称)?

时间:2013-04-26 16:41:30

标签: c# asp.net asp.net-mvc asp.net-membership forms-authentication

问题:

我正在使用表单身份验证和我自己的自定义成员资格提供程序。

从我看到的情况来看,我可以通过以下方式获取当前的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;

我觉得有趣的是,当我调用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保存在那里?

1 个答案:

答案 0 :(得分:2)

是的,可以使用here的解决方法。
可以在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()用作“名称”。