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

时间:2012-03-12 22:04:18

标签: asp.net-mvc forms-authentication

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

您的用户名是否唯一?如果是这样,则无需维护UserId,因为您只需通过用户名检索用户。

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

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

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

答案 1 :(得分:3)

当我为MVC实现自定义成员资格提供程序时,我遇到了同样的问题。我最后做了两件事。我将用户的ID存储在ProviderUserKey对象的MembershipUser字段中。见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背后的核心概念是关注点的分离,这与网络的工作方式密切相关,这是无状态的。虽然我记不清楚我在哪里阅读了。但是我记得还记得,如果你可以消除会话,你应该这样做。它将允许IIS从您的应用程序同时提供请求,而不必等待一个请求完成(并释放用户的会话),然后下一个请求才能使用该会话并发送它的响应。其中最大的影响是使用Ajax加载页面内容。