【问题标题】:Storing and accessing a legacy UserID in asp.net membership在 asp.net 成员中存储和访问旧用户 ID
【发布时间】:2012-02-14 21:15:39
【问题描述】:

我有一个旧版 UserID (int32),我希望将其链接到 asp.net 成员资格。我已经在数据库上设置了链接表,对此我很满意。问题是在 Web 应用程序中将 UserID 存储在何处,以便在需要时可以轻松访问。

我决定存储它的最佳位置是登录控件的 LoggedIn 事件中 FormsAuthenticationTicket 的 UserData 部分。我第一次尝试使其可访问是在我的 BasePage 类的 PreInit 中提取它。这样做的问题是,当 UserControls 需要 UserID 时,它会变得混乱。

是否可以仅将其包装在 Utilities 类中的静态方法或属性中,如下所示:

    public static int UserID
    {
        get
        {
            int userID = 0;
            if (HttpContext.Current.User.Identity is FormsIdentity)
            {
                FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                FormsAuthenticationTicket ticket = id.Ticket;
                userID = Int32.Parse(ticket.UserData);
            }
            return userID;
        }
    }

这似乎可行,但我不知道我是否在这里违反了一些不成文的规则。我认为所有这些东西都在内存中,所以这种访问没有很大的开销。

【问题讨论】:

    标签: asp.net asp.net-membership


    【解决方案1】:

    从功能的角度来看,您的代码看起来不错(虽然我会稍微清理一下,但这更像是一种风格)。

    不过,您可能会考虑将其作为扩展方法,而不是仅仅将其粘贴在随机实用程序类中。也许是 IIdentity 类的扩展?

    int myUserId = HttpContext.Current.User.Identity.MyUserId();
    

    我猜,使用UserData 字段很好。另一种选择是使用自定义Ticket 创建您自己的IIdentity 对象并将它们包装在GenericPrincipal 中——不过,对于您所追求的东西来说可能工作量太大。

    【讨论】:

    • 扩展方法对我来说相当新,所以我不得不做一些阅读 - msdn.microsoft.com/en-us/library/bb383977.aspx 以供将来参考。这看起来不错。可惜他们没有扩展属性(还)。顺便说一句,除了添加错误处理之外,您还想到了哪种“清理一下”。我不认为它看起来那么糟糕。
    • 为了清理,我会使用“as”而不是“is”,避免引用 HttpContext.Current.User 两次,并使用 TryParse 而不是 Parse。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2023-01-05
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多