2

我正在完成一个启动另一个程序员的项目。改变整个架构是不可能的,但有些东西我想覆盖。即 - 授权,以及存储当前用户会话的方式。该项目代表一个通过soap-services与服务器通信的客户端。在服务器上,有 Security-Services,还有其他几个,例如 A-service、B-Service。安全服务提供用于初始化其他服务的身份验证和会话密钥。该项目是用 ASP.NET MVC3 编写的,它是一个用户模型的头部,它被实现为 singletone-Class,它描述了与服务交互的方法。授权是如何工作的 - 有一个带有重写 ValidateUser 方法的 CustomMembershipProvider,它在安全服务上运行。

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 同步会话?对不起我的英语,如果需要澄清 - 问问题。谢谢你。

4

1 回答 1

1

我个人更喜欢更简单的事情,因此如果可以的话,我会有一个专门的用户来使用这些服务,这样你就不必模拟用户到服务层,因此必须维护一个会话密钥。

话虽如此,这并不总是可能的,尤其是在SOA环境中,服务层确实为 3rd 方和审计等提供服务。实际上我的项目看起来像这样。

如果您需要将用户模拟到服务层,您将无法摆脱会话。InProc会话提供更好的性能SqlServer模式提供更好的可伸缩性- 权衡取舍由您决定。

有一种替代方法可以将用户的会话密钥存储在用户表本身中,并且每次都检索并在用户注销时失效。但这只是用户会话的自定义实现

于 2011-05-09T12:41:23.847 回答