云应用程序ASP.Net MVC中的会话维护

时间:2013-11-14 08:03:49

标签: asp.net asp.net-mvc asp.net-mvc-4 azure cloud

我正在使用razor语法在ASP.Net MVC 4上开发一个Web应用程序。我必须在云上部署它,可能在Azure上。 我对login scheme of MVC感到困惑。我们必须处理多个schemas,这就是为什么我们不使用ASP.Net提供的membership

我知道会话维护,我在网络表单中使用它,但会话有一些严重的云问题。

保存用户名和会话数据的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我会避免使用会话状态来存储用户信息甚至会话数据,因为这会降低您的应用程序的可伸缩性。

如果你想存储用户名,显示名称,电子邮件地址,......我会建议基于声明的身份验证。 Brock Allen写了一篇很棒的介绍文章来帮助你入门:Replacing forms authentication with WIF’s session authentication module (SAM) to enable claims aware identity

主要的想法是你分发一个cookie(就像使用Forms Authentication一样):

    Claim[] claims = LoadClaimsForUser(username);
    var id = new ClaimsIdentity(claims, "Forms");
    var cp = new ClaimsPrincipal(id);

    var token = new SessionSecurityToken(cp);
    var sam = FederatedAuthentication.SessionAuthenticationModule;
    sam.WriteSessionTokenToCookie(token);

此cookie代表一个ClaimIdentity,它可以包含一个或多个声明,如电子邮件地址等......

private Claim[] LoadClaimsForUser(string username) {
    var claims = new Claim[]
    {
        new Claim(ClaimTypes.Name, username),
        new Claim(ClaimTypes.Email, "username@company.com"),
        new Claim(ClaimTypes.Role, "RoleA"),
        new Claim(ClaimTypes.Role, "RoleB"),
        new Claim(OfficeLocationClaimType, "5W-A1"),
    };
    return claims; }

就会话数据而言,您可能需要考虑Windows Azure角色缓存或Windows Azure缓存服务。甚至还有会话状态提供程序可以将会话状态存储在缓存中:http://msdn.microsoft.com/en-us/library/windowsazure/gg185668.aspx

但是您可以通过使用缓存键来轻松地自行完成此操作而不使用会话状态,如下所示:

myCache.Put(user.Id + "_Friends", friendsList);