【问题标题】:How to have seperate sessions on 2 asp.net applications如何在 2 个 asp.net 应用程序上进行单独的会话
【发布时间】:2014-07-01 06:18:56
【问题描述】:

我在同一个 IIS (7.5) 上的同一个应用程序池中有两个 asp.net 应用程序 (.NET 4.5)。他们的身份验证表来自两个不同的数据库。我的问题是,当我登录一个应用程序时,我也会登录另一个应用程序(即使另一个应用程序没有相同的用户 ID)。

显然,这两个应用程序共享同一个会话。我已将每个应用程序中的 Web.config 文件更新如下:

<sessionState
  cookieName="some_unique_name"
  timeout="30">
</sessionState>
<membership defaultProvider="SqlProvider">
  <providers>
    <clear/>
    <add 
      name="SqlProvider" 
      type="System.Web.Security.SqlMembershipProvider" 
      connectionStringName="AuthCorporate"
      applicationName="some_unique_name"/>
  </providers>
</membership>

这可能与配置身份和身份验证有关。我在 Startup.Auth.cs 中的 ConfigureAuth() 看起来像这样:

public void ConfigureAuth(IAppBuilder app)
{
    // Enable the application to use a cookie to store information for the signed in user
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login")
    });
}

让这两个应用程序有自己的单独会话我缺少什么?提前致谢。

没有

【问题讨论】:

  • 将 2 个不同的应用程序放在一个应用程序池中可能不是最好的主意。应用程序池用于分隔需要不同安全级别的应用程序。
  • 您在使用 ASP.NET Membership 提供程序吗?如果是这样,您应该在 web.config 中明确设置 applicationName(对于每个应用程序都是唯一的)。它在 标记中...但请向我们提供更多信息
  • @Jeroen1984 我正在使用 ASP.Net Membership 提供程序。但是我还没有在我的 Web.config 中指定与 标记相关的任何内容。你能指点一下如何指定吗?欣赏它。
  • @Nay 如果这是一个新项目,并且您使用的是 Framework 4.5,我真的建议不要使用 Membership Provider。这是处理身份验证/授权的 .Net 2.0 方式。 ASP.NET 身份系统是成员资格的替代品:asp.net/identity。它还具有一些内置功能,例如双因素身份验证、第 3 方登录提供程序(google facebook 等)、密码恢复、电子邮件确认等。如果您使用会员提供程序来实现这一点,这些事情会花费您很多时间。您应该认真考虑是否真的要使用过时的框架
  • 我很抱歉@Jeroen1984,我实际上已经在使用 Identity。我的两个应用程序都在 MVC 5 上。

标签: asp.net .net session iis identity


【解决方案1】:

在您的 cmets 中,您说您正在使用带有 MVC 5 的 Identity。您的 App_Start 文件夹中可能有一个名为 Startup.Auth.cs 的文件。这包含配置身份验证的部分 (OWIN) 启动类的第二部分。

在这个类中你应该配置cookieauthentication,可能带有一个唯一的cookiedomain / cookiename:

   app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                CookieDomain = ".My1stApp.com",
                CookieName = "App1CookieName",
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

【讨论】:

  • 感谢您发布此@Jeroen1984。其实我还在用Identity 1.0,你建议的解决方案是指2.0。我尝试升级到 2.0,但是项目中出现了问题,所以已经恢复到 1.0。在 Identity 1.0 中没有办法做到这一点吗?
  • @Nay 不太确定如何在 1.0 中进行设置,但这里有一篇关于从 1.0 升级到 2.0 的文章(它说 2.0 alpha,但它也适用于 2.0 版本)。它基本上只是更新 nuget 包,然后运行代码优先迁移以将您的身份 2.0 模型中的更改应用到您的数据库。 blogs.msdn.com/b/webdev/archive/2013/12/20/…
【解决方案2】:

这很简单...为每个站点提供自己的应用程序池。应用程序池可以提供一定程度的分离/安全性......比如避免会话中的数据交叉。最好的是只需 10 秒即可解决您的问题。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2010-10-12
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多