我正在完成一个启动另一个程序员的项目。改变整个架构是不可能的,但有些事情我想要覆盖。即 - 授权,以及存储当前用户会话的方式。 该项目代表一个通过soap-services与服务器通信的客户端。在服务器上,有安全服务和其他几个,例如,A服务,B服务。 安全服务提供用于初始化其他服务的身份验证和会话密钥。 该项目是用ASP.NET MVC3编写的,ASP.NET MVC3是用户模型的负责人,它实现为singletone-Class,它描述了与服务交互的方法。 授权如何工作 - CustomMembershipProvider具有重写的ValidateUser方法,该方法在Security-service上运行。如果成功授权发生在asp.net中的用户注册 - FormsService.SignIn(model.UserName,false),然后启动用户类:
class SiteUser
{
public static SiteUser Current
{
get
{
if (HttpContext.Current.Session.IsNewSession & &! HttpContext.Current.User.Identity.IsAuthenticated)
{
throw new UserAutorizationExeption () {Reason = AuthExceptionReason.NewSession};
}
if (HttpContext.Current.Session [sessionKey] == null)
{
FormsAuthentication.SignOut ();
throw new UserAutorizationExeption () {Reason = AuthExceptionReason.ServerSessionExpired};
}
return HttpContext.Current.Session [sessionKey] as W1User;
}
set
{
if (HttpContext.Current.Session! = null)
{
HttpContext.Current.Session [sessionKey] = value;
}
}
}
public SiteUser ()
{
}
public static SiteUser Create ()
{
SiteUser.Current = new SiteUser ();
return SiteUser.Current;
}
/ / Web-services methods go here
}
主要问题是现在会话存储在内存中: web.config:
<sessionState mode="InProc" timeout="20" />
设置SqlServer-mode是有问题的,因为SiteUser序列化很困难。我怎么能绕过这个? 授权存在问题 - 如何正确地与服务会话进行Asp.Net同步会话? 对不起我的英语,如果需要澄清 - 提出问题。谢谢。
答案 0 :(得分:1)
我个人更喜欢简单的事情因此,如果可以的话,我会有一个专门的用户来使用这些服务,因此您不必模仿用户到服务层,因此必须维护会话键。
说过并不总是可行,特别是在 SOA 环境中,服务层确实为第三方和审计提供服务等。实际上我的项目看起来像这样。
如果您需要将用户模拟到服务层,则无法远离会话。 InProc 会话提供更好的性能和 SqlServer 模式提供更好的可伸缩性 - 权衡决定权是你的。
替代用于将用户的会话密钥存储在用户表本身中,并且每次都检索并在用户注销时失效。但这只是只是用户会话的自定义实现。