【问题标题】:ASP.NET MVC project architecture problems — authorization and sessionASP.NET MVC 项目架构问题——授权和会话
【发布时间】:2011-05-09 20:41:23
【问题描述】:

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

主要问题是现在会话存储在内存中: 网络配置:

<sessionState mode="InProc" timeout="20" /> 

设置 SqlServer-mode 是有问题的,因为它很难将 SiteUser 序列化。我怎样才能解决这个问题? 并且授权存在问题 - 如何正确地使用服务会话进行 Asp.Net 同步会话? 对不起我的英语,如果需要澄清 - 问问题。谢谢你。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您对 session 的建议,关于授权您能说些什么?我不喜欢它现在的实现方式——我知道用户只有在尝试获取它时才授权。有了这个,如果服务中发生错误,我知道这不是立即
    • 授权可以在服务层或ASP NET MVC。如果是 SOA,那么必须在服务层。它将用户会话密钥映射到用户并检查它是否具有访问权限。
    • 你能给一些链接来阅读映射会话密钥吗?
    • 这都是定制的——你需要自己做。您的登录将创建一个会话密钥并存储在会话中,然后在每次请求时您都可以将其映射到用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2010-10-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多