我正在完成一个启动另一个程序员的项目。改变整个架构是不可能的,但有些东西我想覆盖。即 - 授权和存储当前用户会话的方法。该项目表示通过 soap-services 与服务器通信的客户端。在服务器上,有安全服务和其他几个,例如,A-服务,B-服务。安全服务提供用于初始化其他服务的身份验证和会话密钥。该项目是用 ASP.NET MVC3 编写的,MVC3 是用户模型的负责人,它作为单调类实现,它描述了与服务交互的方法。授权的工作原理 - 有 CustomMemberProvider 和重写的 ValidateUser 方法,该方法在安全服务上运行。如果授权成功,则用户在 asp.net - FormsService.SignIn(模型。用户名,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 模式是有问题的,因为它很难序列化 SiteUser。我该如何解决这个问题?并且授权存在问题 - 如何正确执行与服务会话 Asp.Net 同步会话?对不起我的英语,如果需要澄清 - 提出问题。谢谢。
我个人更喜欢更简单的东西,因此如果可以的话,我会有一个专门的用户来使用这些服务,这样您就不必将用户模拟到服务层,因此必须维护会话密钥。
话虽如此,这并不总是可能的,尤其是在服务层确实向第三方提供服务和审计等的 SOA 环境中。事实上,我的项目看起来像这样。
如果需要将用户模拟到服务层,则无法摆脱会话。InProc 会话提供更好的性能,SqlServer 模式提供更好的可伸缩性 - 权衡由您决定。
还有一种替代方法,可以将用户的会话密钥存储在用户表本身中,并在每次检索并在用户注销时失效。但这只是用户会话的自定义实现。