【问题标题】:Best practice to maintain a user id (MVC)维护用户 ID (MVC) 的最佳实践
【发布时间】:2023-03-12 04:41:01
【问题描述】:

我使用 FormsAuthentication,但我添加了一个自定义 MemberShipProvider 来验证自定义用户表。

所有包含“用户数据”的表都有一个 idUser 列,所以我需要维护用户 ID 以便向用户展示他的数据。

以前我使用过一个会话变量(ASP.NET Webform),但是当我将 web 应用程序重写为 MVC 时,我想问一下通常认为什么是最好的方法。

会话变量仍然是保存 idUser 的最佳位置,还是我应该添加一个自定义“Current.User.Identity”,除了用户名之外还保存一个公共 userId??

或者我应该选择完全不同的方法?

【问题讨论】:

    标签: asp.net-mvc forms-authentication


    【解决方案1】:

    当我为 MVC 实现自定义成员资格提供程序时,我遇到了同样的问题。我最终做了两件事。我将用户的 ID 存储在 MembershipUser 对象的 ProviderUserKey 字段中。见provideruserkey。然后回答您的问题,是的,我从 System.Web.Security.IPrincipal 创建了一个自定义主体,但后来我从 System.Web.Security.RolePrincipal 继承,因为我想要支持角色。

    public class MyPrincipal : RolePrincipal
    {
        public Guid Id { get; set; }
    
        public MyPrincipal(string providerName, IIdentity identity, Guid id) : base(identity)
        {
            Id = id;
        }
    }
    

    更新:我不想在我的案例中使用 session 的原因是因为我已经为应用程序禁用了它。我读过 MVC 背后的核心概念是关注点分离,这与 Web 的工作方式密切相关,它是无状态的。虽然我不记得我在哪里读到的,现在我试着记住了。但是,我确实还记得阅读过,如果您可以消除会话,则应该这样做。它将允许 IIS 提供来自您的应用程序的同时请求,而不必等待一个请求完成(并释放用户的会话),然后下一个请求才能使用会话并发送它的响应。其中最大的影响是使用 Ajax 加载页面内容。

    【讨论】:

    • 谢谢!我正在考虑类似的方法。虽然我同意上面的@Mark S.,但最简单的方法是使用会话对象。
    • 添加了我为什么避免会话的详细信息
    • 会话不一定是邪恶的,可能是必要的。我经常看到用户禁用会话并开始过度依赖 cookie,从而增加了每个 HTTP 请求的大小。处理同时请求的另一种方法是使用异步控制器,这在 MVC4 测试版中非常简单,并且可以在以前的版本中完成一些工作。
    【解决方案2】:

    您的用户名是唯一的吗?如果是这样,则无需维护 UserId,因为您可以简单地通过用户名检索用户。

    我的 MVC 项目已经实现了与传统 Web 窗体应用程序大致相同的 Membership。除非您尝试构建无状态 REST 类型的应用程序,否则我认为没有任何理由以不同的方式看待这两者。您是如何在 Web 表单中维护您的 UserId 的?会议?然后在 MVC 中使用会话。没有理由重新发明轮子。

    当然,如果您有其他更改原因,还有很多方法可以存储 UserId。您可以将其存储在身份验证 cookie 的 UserData 中。您还可以创建自己的身份验证票证,使用 UserId 作为密钥而不是用户名。您甚至可以创建一个自定义主体来存储一些附加信息。

    您可能想查看Forms Authentication Configuration and Advanced Topics。本文介绍了在身份验证票证中存储附加数据 (UserId) 并创建自定义主体。这两种方法都可能符合您的要求。

    【讨论】:

    • 用户名是唯一的,但我需要 userId 因为这是我的模型(数据库)中的标识列。所以从表中获取数据,我需要使用 ... where userid = idUser 查询它。我会查看您提供的链接:)
    • Session 是维护您的 UserId 的最简单、最快捷的方法。 MVC 的使用当然不排除会话的使用。我的 2 美分,使用会话。
    • 我同意。它在我的网络表单应用程序中运行良好。我主要担心的是,在 MVC 中,这种方法“过时”了。再次感谢! :)
    猜你喜欢
    • 2018-08-26
    • 2017-12-22
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2016-10-20
    • 2011-08-04
    相关资源
    最近更新 更多