asp.Net単一ログイン
7791 ワード
asp.Netアプリケーションによる単一ログイン制限
原理:ユーザーがログインした後、システムはユーザーに唯一対応するSessionIDを割り当て、現在のユーザーIDとそのSessionIDを対応付けてApplicationに保存し、そのユーザーが他の場所で繰り返しログインすると、Applicationに保存したSessionIDが更新され、現在のsessionのSessionIDとApplicationのSessionIDが一致しなくなる
ユーザーがログインしてセッションIDをアプリケーションに保存する
判断方法
aspxページジャンプ時判断:ベースクラスBasePageを追加する.cs
ashxページ要求時判断:ベースクラスBaseHandlerを追加する.cs
原理:ユーザーがログインした後、システムはユーザーに唯一対応するSessionIDを割り当て、現在のユーザーIDとそのSessionIDを対応付けてApplicationに保存し、そのユーザーが他の場所で繰り返しログインすると、Applicationに保存したSessionIDが更新され、現在のsessionのSessionIDとApplicationのSessionIDが一致しなくなる
ユーザーがログインしてセッションIDをアプリケーションに保存する
private static void RecordLogin(string strUId)
{
HttpContext.Current.Application.Lock();
HttpContext.Current.Application["SESSIONID_" + strUId] = HttpContext.Current.Session.SessionID;
HttpContext.Current.Application.UnLock();
}
判断方法
public static bool CheckRepeatLogin(string strUId)
{
object objSessionId = HttpContext.Current.Application["SESSIONID_" + strUId];
if (objSessionId == null || objSessionId.ToString() == "") return false;
return objSessionId.ToString() != HttpContext.Current.Session.SessionID;
}
aspxページジャンプ時判断:ベースクラスBasePageを追加する.cs
public class BasePage:System.Web.UI.Page
{
public UserInfo CurUser = null;
protected override void OnInitComplete(EventArgs e)
{
CurUser = CurSession.CurUser;
if (CurUser == null)
{
Response.Redirect(SysHelper.GetVirtualPath() + "pagesessionnull.html", true);
}
if (LoginService.CheckRepeatLogin(CurUser.UId))
{
Response.Redirect(SysHelper.GetVirtualPath() + "pagerepeatlogin.html", true);
}
base.OnInitComplete(e);
}
protected override void OnLoadComplete(EventArgs e)
{
Response.Cache.SetNoStore();
base.OnLoadComplete(e);
}
}
ashxページ要求時判断:ベースクラスBaseHandlerを追加する.cs
public class BaseHandler : IHttpHandler, IRequiresSessionState
{
public UserInfo CurUser = null;
public HttpContext CurContext = null;
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.Charset = "utf-8";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
try
{
CurUser = CurSession.CurUser;
CurContext = context;
if (CurUser == null)
{
context.Response.Write(JsonHelper.GetResult(false, " , ", new { rcode = -98 }));
}
else if (LoginService.CheckRepeatLogin(CurUser.UId))
{
context.Response.Write(JsonHelper.GetResult(false, " , , ", new { rcode = -99 }));
}
else
{
context.Response.Write(ActionMethod());
}
}
catch (Exception ex)
{
context.Response.Write(JsonHelper.GetResult(ex.Message.ToString()));
}
finally
{
context.Response.End();
}
}
public virtual string ActionMethod()
{
return JsonHelper.GetResult();
}
public bool IsReusable
{
get
{
return false;
}
}
}