之前已经提出了类似的问题,但我仍然没有答案,并花了相当多的时间试图找到一个.
情景是这样的.我们有一个ASP.NET MVC应用程序,它使用Forms Authentication / LINQ-to-SQL数据模型.
每个用户可以与一个或多个帐户相关联.登录后,应用程序将检查与其关联的帐户数.
0 =转到错误页面,让他们知道他们没有访问权限
1 =设置用户数据以使用该帐户
2个或更多=转到允许他们选择他们想要使用的帐户的页面(能够在访问期间更改)
你会如何存储这些信息?
此外,我想使用此帐户作为我的控制器操作的基础.即他们访问的后续页面上的数据将与他们选择的帐户相关.
单身咳嗽浮现在脑海中,但我不确定如何实现这一点.
我目前正在研究的一种方法是一个基本控制器,所有控制器都将从中继承
>检查用户是否已登录.
>如果是,请检查他们是否选择了帐户
>否 – 将其重定向到“帐户选择”页面
>是 – 继续原始请求
这样做的推荐/最佳实践方法是什么?
谢谢
马尔科
最佳答案 不要使用基本控制器.您可以使用操作过滤器完成此操作.这将为您提供拦截点,以检查他们是否已登录,是否已选择帐户,甚至将其重定向到错误或帐户选择页面.您所要做的就是在动作过滤器的OnActionExecuting方法中设置filterContext.Result以防止请求通过.在操作期间,您可以完全访问会话,临时数据,cookie和整个HttpContext,就像在控制器中一样.您还可以使用过滤器属性过滤器提供程序注入依赖项属性,以便为您提供所需的任何数据访问权限.
至于对数据建模,我对Linq to SQL不太熟悉,但我认为正常的一对应该可以做到这一点:
User (1) <-------> (0..*) Account
public class User
{
public virtual ICollection<Account> Accounts { get; protected internal set; }
}
public class Account
{
public int UserId { get; protected internal set; }
public virtual User User { get; protected internal set; }
}
更新:对不起,我误解了你对“商店”的意思.在MVC中,只有几种方法可以存储它 – Session,Cookie和Cache(以及TempData,它只是短期会话)是最受欢迎的选择.我的选择取决于.会话可能是最简单的,但如果您使用负载均衡器部署到服务器场,则需要考虑如果用户的会话跳转物理机会发生什么.会议会保持不变吗?
正如杰里米所说,还有饼干.不用担心这里的负载平衡,但语义比会话更难处理.例如,您必须先发送重定向来编写cookie,然后才能阅读它,而且我从未喜欢过必须添加过期的cookie来删除cookie.由于此数据是您安全性的一部分,因此您可能还需要加密cookie值.
如果使用缓存,数据很可能最终仍然存在于内存中,如会话(除非您使用的是SQL会话提供程序).缓存可能是我的最后选择,因为我们使用Azure,他们的缓存不支持很多很棒的MVC功能.负载均衡器将用户移动到群集中的其他计算机时也会遇到同样的问题,其中可能必须重新缓存数据.
无论哪种方式,您仍应使用动作过滤器而不是基本Controller类.