ASP.NET MVC项目架构问题 - 授权和会话

时间:2011-05-09 12:31:56

标签: asp.net asp.net-mvc-3 asp.net-session asp.net-authorization

我正在完成一个启动另一个程序员的项目。改变整个架构是不可能的,但有些事情我想要覆盖。即 - 授权,以及存储当前用户会话的方式。 该项目代表一个通过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同步会话? 对不起我的英语,如果需要澄清 - 提出问题。谢谢。

1 个答案:

答案 0 :(得分:1)

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

说过并不总是可行,特别是在 SOA 环境中,服务层确实为第三方和审计提供服务等。实际上我的项目看起来像这样。

如果您需要将用户模拟到服务层,则无法远离会话。 InProc 会话提供更好的性能 SqlServer 模式提供更好的可伸缩性 - 权衡决定权是你的。

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