限制访问asp.net网站的用户数量

4

如何最好地限制访问Web应用程序的(并发)用户数量,以便任何人都可以向客户介绍出售网站/应用程序,并如何增加远程访问它的用户数量?


我认为你需要更详细地解释你想要什么。你可能正在考虑并发用户的数量。不清楚你是否将在与Web应用程序进行分离的交互中建立“会话”。[...更多...] - Jonathan Leffler
另外,将问题中“如何增加”的部分单独成为一个句子。我认为这可能是在问“我如何在管理上更改允许的会话数量”。那很简单;编辑数据库中规定的并发会话数量的数据即可。[...更多内容...] - Jonathan Leffler
然而,您可能也不希望除了应用程序的发布者授权之外,任何人都能这样做 - 可能是在收到部署应用程序的人更多的资金后。在这种情况下,您正在处理许可和许可证执行。[...更多...] - Jonathan Leffler
所以,您需要详细说明您真正询问的内容,以使问题更加清晰明了。(我预计限制可以由使用私钥加密的数据提供 - 您将公钥嵌入应用程序中,并使用它来解密指定限制的加密数据。) - Jonathan Leffler
参见:https://dev59.com/XkfRa4cB1Zd3GeqP6ibD - Jon Seigel
3个回答

6
如果您使用进程内会话状态管理,可以使用 HttpApplicationState 类,通过引入 Global.asax 文件并在代码后端放置以下内容:
void Application_Start(object sender, EventArgs e)
{
    Application["ActiveSessions"] = 0;
}

void Session_Start(object sender, EventArgs e)
{
    try
    {
        Application.Lock();

        int activeSessions = (int) Application["ActiveSessions"] + 1;
        int allowedSessions = 10; // retrieve the threshold here instead

        Application["ActiveSessions"] = activeSessions;

        if (activeSessions > allowedSessions)
            System.Web.HttpContext.Current.Response.Redirect("~/UserLimitReached.aspx", false);
    }
    finally
    {
        Application.UnLock();
    }
}

void Session_End(object sender, EventArgs e)
{
    Application.Lock();
    Application["ActiveSessions"] = (int)Application["ActiveSessions"] - 1;
    Application.UnLock();
}

然后,在UserLimitReached.aspx页面中,您将调用HttpSession.Abandon()来有效终止当前会话,以便它不计入限制。其余部分需要您自己解决。:)


请注意,如果您的会话存储在注册表或 SqlServer 中,则不会调用 Session_End。创建新的 global.asax 文件时,请查看注释以明确此内容。 - Bernhard Hofmann

0
一种方法是在数据库中跟踪活动会话,并每次用户登录时检查活动会话的数量。如果低于阈值,则允许他们进入,否则将其拒绝。
为了远程管理这个数字,一个简单的管理员表单可以让您在数据库中更新阈值。

0
除了之前的回答,我认为你需要引入自己的超时时间,以便会话不会被遗留和锁定。如果有登录功能,您可以基于登录监视它,并记录每个用户的最近活动在字典/数组中,以保持它们处于活动状态。这应该很容易看到哪些用户正在使用网站,哪些是最近活跃的用户。如果将其与会话绑定,则可以过期使用最近不活跃用户的会话。这样做的效果是,如果超过指定数量的用户尝试使用网站,一些用户(最不活跃的)将不断需要登录。考虑到Web应用程序的断开性质,我认为您可能需要允许一定比例的宽限度,以便在限制为20个用户时,实际上可以同时允许22个用户处于活动状态。

你说的"left lingering"或者"locked" session是什么意思?这个问题能否复现?我做了一些测试发现Session_End()似乎总是被调用,即使用户关闭浏览器或者session自己过期。 - tigrou
1
如果用户关闭浏览器并重新启动,则其先前的会话将不会结束,并且其新会话的活动会话计数将增加。我认为ASP将在默认情况下(20分钟后)结束非活动会话,但这可能会导致拒绝服务,因为您认为是“活动”会话的会话已不再活动,但由于Application [“ActiveSessions”]达到了限制而限制了用户。 - Bernhard Hofmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接