我正在ASP.Net MVC 4使用剃刀语法开发一个 Web 应用程序。我必须将它部署在云上,可能在 Azure 上。我对login scheme of MVC. 我们必须在多个方面工作,schemas这就是为什么我们不使用membershipASP.Net 提供的。
我知道会话维护,我在 Web 表单中使用它,但会话在云方面存在一些严重问题。
保存用户名和会话数据的最佳方法是什么?
我正在ASP.Net MVC 4使用剃刀语法开发一个 Web 应用程序。我必须将它部署在云上,可能在 Azure 上。我对login scheme of MVC. 我们必须在多个方面工作,schemas这就是为什么我们不使用membershipASP.Net 提供的。
我知道会话维护,我在 Web 表单中使用它,但会话在云方面存在一些严重问题。
保存用户名和会话数据的最佳方法是什么?
我会避免使用会话状态来存储用户信息甚至会话数据,因为这会降低您的应用程序的可扩展性。
如果你想存储用户名、显示名、电子邮件地址……我建议基于声明的身份验证。Brock Allen 写了一篇很棒的介绍文章来帮助您入门:用 WIF 的会话身份验证模块 (SAM) 替换表单身份验证以启用声明感知身份。
主要思想是您分发一个 cookie(就像使用表单身份验证一样):
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 In-Role Caching 或 Windows Azure Caching Service。甚至还有一个会话状态提供程序可以将会话状态存储在缓存中:http: //msdn.microsoft.com/en-us/library/windowsazure/gg185668.aspx。
但是您可以通过使用缓存键轻松地自己完成此操作,而无需使用会话状态,如下所示:
myCache.Put(user.Id + "_Friends", friendsList);