none
使用者登入後強迫更改密碼,否則限制可瀏覽頁面 RRS feed

  • 問題

  • 使用者的帳號密碼是管理者給定的,所以有一定的規則

    現在要使用者登入時要求使用者更新密碼

    若不更新密碼就不讓他瀏覽其它的頁面

    那限制瀏覽頁面這部份該如何實作?

    • 已編輯 蛤? 2010年4月1日 上午 04:12 錯字
    2010年4月1日 上午 04:11

解答

所有回覆

  • 使用者資料表多開一個bit欄位,用來記錄使用者是否變更過密碼

    限制瀏覽頁面的Page_Load就去抓這個欄位值來判斷可不可以瀏覽

    2010年4月1日 上午 04:15
    版主
  • 我要限制的頁面有很多頁,未來可能還會增加

    這方面有更好的解決方法嗎?

    2010年4月1日 上午 05:21
  • Hi,

    在HttpHandler去對每個頁面的Request來作判斷處理。

     

    Regards,

    Lolota


    微軟技術支援中心 CSS - http://www.dotblogs.com.tw/lolota
    • 已標示為解答 蛤? 2010年4月6日 上午 12:42
    2010年4月1日 上午 05:59
  • 您可以利用Login控制項的LoggedIn事件, 在LoggedIn事件處理程序中, 判斷aspnet_membership資料表(存放使用者密碼的資料表)中"CreateDate"和"LastPasswordChangedDate"欄位的內容值是否相同, 如果是則將使用者密碼記錄的IsApproved 欄位的內容值設定成False, 然後強迫使用者至變更密碼網頁變更密碼.
    2010年4月1日 上午 06:03
  • 嗯,我想要的是如何「強迫使用者至變更密碼網頁變更密碼」.

    的這個方法

    lolota 大大的方法正在研究!

    2010年4月1日 上午 06:06
  • 阿尼大說的方式也可以啊,

    你只要寫一個BasePage的class繼承System.Web.UI.Page,

    然後原本的一般頁面都改為繼承BasePage。

    這樣只需要在BasePage的Page_Load檢查即可。

    因為每一個繼承BasePage的頁面都會跑到BasePage的Page_Load事件。

    這樣多一個superclass,未來才方便統一調整某一些東西。

    當然正規的作法是像Lolota大說的從request下手啦。


    常用資源參考:
    小弟的blog: In 91
    • 已提議為解答 TerryChuang 2010年4月5日 上午 09:44
    2010年4月1日 上午 06:14
    版主
  • 在HttpHandler去對每個頁面的Request來作判斷處理

    這該如何達成?

    能再多點提示嗎?

    是在Application_BeginRequest 裡面判斷嗎?

    2010年4月1日 上午 07:04
  • 我使用此方法測試出來了,謝謝各位大大的幫忙protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        if (Session["id"] != null)
        {
            if (HttpContext.Current.Session["id"].ToString() == "new")
            {
                Response.Redirect("default.aspx");
            }
        }
    }
    2010年4月1日 上午 07:56
  • session的命名用id可能會導致後續維護上的困擾唷。

    究竟Session["id"]是代表「登入的使用者ID」,還是代表「有修改過密碼」,命名只是個小動作,不過可以替之後帶來不少的好處。

    您也可以在Session裡面放一個自己定義的UserInformation物件,然後有使用者資訊相關的屬性可以設定。

    例如UserInfo.PasswordType=true或false,或是透過Enum來定義目前使用者是屬於那一種狀態。

    比較不會讓Session散落一地,或是有命名上的困擾。


    常用資源參考:
    小弟的blog: In 91
    2010年4月1日 上午 08:14
    版主
  • Session["id"]是代表「登入的使用者ID」

    在登入後發現「沒有修改密碼」就不送出驗證,Session["id"]設為特定字串

    在pplication_PreRequestHandlerExecute裡判斷若Session["id"]設為特定字串就導向修改密碼的網頁,改完重新登入;若有修改密碼,驗證成功Session["id"]=登入的使用者ID

    一開始測試成功,可目前遇到

    if (HttpContext.Current.Session["id"] != null)

    錯誤訊息:並未將物件參考設定為物件的執行個體

    2010年4月1日 上午 08:25
  • 1. 我指的問題點就是在「特定字串」,這是比較不好的設計。搞不好有User的Id就跟特定字串一樣。如果使用者的資料是可以維護的話。

    既然是狀態,就不需要跟ID混著用,現在的方便,對未來系統的維護是種負擔。

    2.既然已經寫過這麼多程式了,

    應該在發現問題時,提出你的「並未參考物件個體」,到底是那個東西是null。

    一開始的測試成功,跟之後的Null,執行過程或操作有什麼不同?


    常用資源參考:
    小弟的blog: In 91
    2010年4月1日 上午 08:36
    版主
  • 回91大

    操作過程為:未登入,一切正常

    登入,Session["id"]=使用者id在轉換到登入後的頁面第一次可以,第二次出現錯誤

    錯誤訊息為:

    在此內容中無法使用工作階段狀態。

    • 已編輯 蛤? 2010年4月1日 上午 09:49 補充
    2010年4月1日 上午 09:29
  • 我覺得你的問題有點詭異,你說要強迫使用者修改他的密碼,否則不想讓他瀏覽其他頁面...

    那我有問題,所以本來沒有帳號的使用者應該都不能去瀏覽其他頁面嗎?

    如果是的話,那你的問題就好解,就卡在登入後強制他一定要修改密碼,

    如果不是,那你如何去判斷一個"還沒登入"的使用者是根本"沒帳號的一般使用者"還是"有帳號但沒修改的使用者"呢?

     

    這是我看完後覺得怪怪的地方...


    gipi的學習筆記:http://www.dotblogs.com.tw/jimmyyu/
    2010年4月1日 下午 04:15
  • 『Session["id"]=使用者id在轉換到登入後的頁面第一次可以,第二次出現錯誤』

    我還是不懂您的第一次和第二次的差別是啥...

    登入第二次? 還是登入後頁面PostBack? 還是登入後頁面,在導到別頁?

     


    常用資源參考:
    小弟的blog: In 91
    2010年4月2日 上午 02:44
    版主
  • 回gipi大:

    有網站一般網頁及會員專區,會員專區要先登入才能瀏覽。

    我想做的是,如果他登入時是「第一次登入」,也就是系統預設的密碼,還沒經過使用者的修改,就必須強迫使用者修改,否則無法進入瀏覽會員專區的網頁。若使用者還是不想改,那他衣舊可以瀏覽一般網頁。

    如果不是,那你如何去判斷一個"還沒登入"的使用者是根本"沒帳號的一般使用者"還是"有帳號但沒修改的使用者"呢?

    我的做法是只區分有登入或沒登入,只要登入便判斷是否修改過密碼。沒登入跟沒帳號視為同一種。登入後有修改及沒修改密碼皆允許登入,但沒修改密碼的權限最低,只能覽瀏會員專區裡修改密碼這一頁。

    回91大:

    在任何頁面底下(例如Default.aspx),按下「偵錯」先進入Application_PreRequestHandlerExecute(第一次)

    在進Default.aspx的Page_Load,

    跑完Default.apsx的程式後 再進入Application_PreRequestHandlerExecute(第二次)

    最後呈現Default.aspx。整個過程都沒動到Session["id"]的值,都在if (HttpContext.Current.Session["mod"] != null) 時出錯。

    protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
    
        if (HttpContext.Current.Session["mod"] != null)
            {
                string ss = HttpContext.Current.Session["mod"].ToString();
                if (ss == "yet")
                {
                        Response.Redirect("login.aspx");
                }
            }
    }

    2010年4月3日 下午 02:37
  • hi, 這裡有篇文章給您參考一下:"Session state is not available in this context" exception accessing ASP.NET Session in PreRequestHandlerExecute event

    最後也有他提出的解法,

    原因有可能是 not all HttpHandlers implement IRequiresSessionState.

    解法是:check that the current handler implements either IRequiresSessionState or IReadOnlySessionState.

    範例:

           public void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
            {
                if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
                {
                    //InitializeMultiSessionFactoryNHibernate();           
                }           
            }

    最後,請您看一下錯誤的時候的output視窗,也就是輸出視窗,

    有沒有StackTrace,看一下出錯的點在哪裡。以該篇文章為例子,stack就是出錯在InitializeMultiSessionFactoryNHibernate


    常用資源參考:
    小弟的blog: In 91
    • 已標示為解答 蛤? 2010年4月4日 上午 04:16
    2010年4月3日 下午 03:28
    版主
  • 小喵的方式提供您方向給您參考看看

    1.小喵用的權限控管機制不是Session來判斷,而是ASP.NET 2.0以後的權限控管機制,搭配自己的使用者資料表

    詳細請看這篇:學習ASP.NET會員機制三部曲的第三部曲

    2.小喵會在使用者資料表中,安排一個欄位(ChgPwTime),用來記錄最近修改密碼時間,預設為空字串

    3.撰寫PageBase類別,然後透過web.config設定每一頁繼承此類別

    參考這篇:http://www.dotblogs.com.tw/topcat/archive/2008/03/05/1250.aspx

    4.在PageBase類別中的Page_Load事件中,如果User.Identity.Name有資料時,檢查最近修改密碼時間是否有值,如果有,代表已經設定過密碼,如果沒有,就透過Response.Redirect轉到變更密碼畫面。

    5.變更密碼後,ChgPwTime的時間

     

    透過這樣就能夠處理您的需求了,如果下次要改成每三個月要變更一次,那麼還可以拿這個變更時間來計算到目前已經多久沒變更密碼了

    以上的方式概念提供您參考囉

    加油!!

    ^_^


    topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/
    2010年4月3日 下午 04:33
    版主
  • 回91大:

     if (HttpContext.Current.Session["mod"] != null)的錯誤訊息為:並未將物件參考設定為物件的執行個體

    輸出視窗訊息:

    第一個可能發生的例外狀況類型 'System.NullReferenceException' 發生於 App_global.asax.c8pdxras.dll

    91大提供的方法解決問題,比我原先使用try  catch 的硬上方式好非常多。

     

    回喵大:

    您那三部曲的文章小弟已拜讀過,對於網站開發及觀念有很大的啟發。

    p.s. 似乎有很多人在等喵大的第四部曲...

     

    2010年4月4日 上午 04:15