2012-03-12 47 views
6

我使用FormsAuthentication,但我添加了一个自定义MemberShipProvider以根据自定义用户表进行验证。维护用户标识(MVC)的最佳实践

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

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

会话变量仍然是持有idUser的最佳位置,或者我应该添加一个自定义的“Current.User.Identity”,除了用户名还包含一个public userId?

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

回答

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背后的核心概念是关注点的分离,并且这与网络的工作方式密切相关,这是无状态的。尽管我不记得自己现在读的那些东西,但我现在还记得。不过,我还记得,如果你可以消除会话,你应该这样做。它将允许IIS提供来自应用程序的同时请求,而不必等待一个请求完成(并释放用户会话),然后下一个请求才能使用会话并发送响应。其中最大的影响是使用Ajax加载页面内容。

+0

谢谢!我正在考虑类似的方法。虽然我赞同@Mark S.上面的说法,但最简单的是使用会话对象。 – Kman 2012-03-12 22:56:56

+0

增加了为什么我避开了会议的细节 – 2012-03-12 23:00:10

+0

会议不一定是邪恶的,可能是必要的。通常我会看到用户禁用会话,并开始过度依赖Cookie来增加每个HTTP请求的大小。另一种同时处理请求的方法是使用异步控制器,这在MVC4测试版中非常简单,并且可以在以前的版本中完成一些小工作。 – Mark 2012-03-12 23:08:25

3

是你的用户名独特的吗?如果是这样,则不需要维护UserId,因为您可以简单地通过用户名检索用户。

我的MVC项目已经实现了成员身份,与传统的Web窗体应用程序非常相似。我认为除非你试图构建一个无状态的REST类型的应用程序,否则没有任何理由去看两者。你是如何在Web Forms中维护你的UserId的?会议?然后在MVC中使用会话。没有理由重新发明轮子。

当然,如果你有其他改变的原因,有很多方法来存储UserId。您可以将其存储在身份验证Cookie的UserData中。您也可以创建自己的身份验证票证,该票证使用UserId作为密钥而不是用户名。你甚至可以创建一个Custom Principal来存储一些额外的信息。

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

+0

用户名是唯一的,但我需要userId,因为这是我的模型(数据库)中的标识列。所以从我需要查询它的表中获取数据...其中userid = idUser。我会看看你提供的链接:) – Kman 2012-03-12 22:43:24

+0

会话是最简单,最快捷的方式来维护你的UserId。 MVC的使用当然不排除会话的使用。我的2美分,使用会话。 – Mark 2012-03-12 22:50:49

+0

我同意。它在我的webform应用程序中运行的很好。我主要担心的是,在MVC中,这种方法是“过时的”。再次感谢!:) – Kman 2012-03-12 22:59:08