保持用户ID的最佳实践(MVC)

6
我使用FormsAuthentication,但我添加了一个自定义的MemberShipProvider来验证自定义用户表中的用户。所有包含“用户数据”的表都有一个idUser列,因此我需要维护用户ID以便向用户呈现他的数据。以前我使用过一个会话变量(ASP.NET Webform),但由于我正在重写Web应用程序以使用MVC,因此我想问什么通常被认为是最佳方法。会话变量仍然是保存idUser的最佳位置吗?还是应该添加一个自定义的“Current.User.Identity”,除了用户名外,还包含一个公共的userId?或者我应该选择完全不同的方法?
2个回答

3

当我为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;
    }
}
更新:我之所以不想在我的情况下使用会话是因为我已经为应用程序禁用了它。我读过MVC背后的核心概念是关注点分离,这与Web工作方式非常相似,即无状态。虽然我现在试图回忆起我在哪里读到这个,但我确实记得也读过,如果你能消除会话,就应该这样做。这将允许IIS从您的应用程序中提供同时请求,而不必等待一个请求完成(并释放用户的会话)才能使下一个请求使用会话并发送其响应。其中最大的影响是使用Ajax加载页面内容。

谢谢!我正在考虑类似的方法。尽管我同意上面@Mark S.的观点,最简单的方法是使用会话对象。 - Kman
增加了为什么我避免使用会话的详细信息。 - Nick Albrecht
Session并不一定是有害的,而且可能是必需的。我经常看到用户禁用会话并开始过度依赖cookie,从而增加每个HTTP请求的大小。另一种同时处理请求的方法是使用异步控制器,在MVC4 beta中非常容易实现,并且在之前的版本中也可以通过一些工作来完成。 - Mark

3

你的用户名是唯一的吗?如果是,那么就没有必要维护UserId,因为你可以通过用户名简单地检索用户。

我的MVC项目实现了与传统Web Forms应用程序类似的成员身份。除非你试图构建无状态REST类型的应用程序,否则我认为没有理由将这两种方式看作不同的方式。在Web Forms中,你是如何维护UserId的?会话吗?然后在MVC中使用会话。没有必要重复造轮子。

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

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


用户名是唯一的,但我需要userId,因为那是我的模型(数据库)中的标识列。所以要从表中获取数据,我需要使用... where userid = idUser 进行查询。我会查看您提供的链接 :) - Kman
会话(Session)是维护用户ID的最简单、最快捷的方式。使用MVC当然不排除使用会话(Session)的可能性。我的建议是,使用会话(Session)。 - Mark
我同意。在我的Web表单应用程序中,它运行良好。我的主要担忧是,在MVC中,这种方法已经“过时”了。再次感谢! :) - Kman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接