asp.Net単一ログイン

7791 ワード

asp.Netアプリケーションによる単一ログイン制限
原理:ユーザーがログインした後、システムはユーザーに唯一対応する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;
        }
    }
}