我做了一个功能,可以防止一个用户名同时登录多个,我在 Actions 中调用它,如下所示:
int userId = (int)WebSecurity.CurrentUserId;
if ((this.Session.SessionID != dba.getSessionId(userId)) || dba.getSessionId(userId) == null)
{
WebSecurity.Logout();
return RedirectToAction("Index", "Home");
}
所以重点是每次用户登录时,我都会将他的 sessionID 保存到数据库字段中。因此,如果具有相同用户名的人登录已经使用相同用户名登录的人,它将用这个新会话覆盖该数据库字段。如果数据库中的 sessionID 与登录用户的当前会话 ID 不同,则将他注销。
是否有可能将这部分代码放在一个地方,或者我是否必须将它放在我的应用程序的每个操作中?
我在 Global.asax 中试过:
void Application_BeginRequest(object sender, EventArgs e)
{
if (Session["ID"] != null)
{
int userId = Convert.ToInt32(Session["ID"]);
if ((this.Session.SessionID != db.getSessionId(userId)) || db.getSessionId(userId) == null)
{
WebSecurity.Logout();
}
}
}
但是如果我这样尝试,我不能在这里使用 Session 也不能使用 WebSecurity 类:
void Application_BeginRequest(object sender, EventArgs e)
{
int userId = (int)WebSecurity.CurrentUserId;
if ((this.Session.SessionID != db.getSessionId(userId)) || db.getSessionId(userId) == null)
{
WebSecurity.Logout();
Response.RedirectToRoute("Default");
}
}
因为我得到空引用异常。
编辑
我用这个:
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
int userId = (int)WebSecurity.CurrentUserId;
using (var db = new UsersContext())
{
string s = db.getSessionId(userId);
if ((filterContext.HttpContext.Session.SessionID != db.getSessionId(userId)) || db.getSessionId(userId) == null)
{
WebSecurity.Logout();
filterContext.Result = new RedirectResult("/Home/Index");
}
}
}
我必须使用 using 语句作为上下文,否则db.getSessionId(userId)返回旧的 sessionId。方法是这样的:
public string getSessionId(int userId)
{
string s = "";
var get = this.UserProfiles.Single(x => x.UserId == userId);
s = get.SessionId;
return s;
}
很奇怪,将不得不阅读为什么会发生这种情况。
一切正常,除了一件事。我在控制器中有一个 JsonResult 操作,它返回 Json,但是由于事件(它在输入事件上的文本框)无法触发 POST(我认为这是因为它之前注销)重定向不起作用。它甚至无法发布到该 Json 操作以接收回调和重定向。有什么线索吗?
success: function (data) {
if (data.messageSaved) {
//data received - OK!
}
else {
// in case data was not received, something went wrong redirect out
window.location.href = urlhome;
}
}
在我使用 ActionFilterAttribute 之前,我使用代码检查 POST 中的不同会话,当然它可以进行回调,因此如果没有收到数据则重定向。但现在因为它甚至不能 POST 并进入方法,它只是卡在那里并且不重定向:)