none
請問有關Context.User.Identity 與 Request.IsAuthenticated 之間的問題 RRS feed

  • 問題

  • 大家好,

              最近遇到一個登入上問題,但這個問題又不是每次都會發生,而是偶發.
    程式中判斷Request.IsAuthenticated 是TURE,但在讀取Context.User.Identity確有時會是NULL
    不知可能的錯誤為何呢? 請大家提供追尋方向,謝謝!
    2009年4月28日 上午 03:27

解答

  • 基本上 Request.IsAuthenticated 會傳回 true,必須要通過三個條件:

    1. HttpContext.Current.User 不是 NULL
    2. HttpContext.Current.User.Identity 不是 NULL
    3. HttpContext.Current.User.Identity.IsAuthenticated 是 true

    有一個條件不符合,就會傳回 false。

    你的問題有可能是你取的不是 HttpContext.Current 所回傳的 HttpContext 物件。
    小人物一枚。
    • 已標示為解答 dan0605 2009年4月29日 上午 03:36
    2009年4月28日 上午 03:35
    版主
  • 你要不要用除錯器看看 Context.User 本身是不是 NULL ...

    不過這狀況確實有點奇怪,因為 Context.User 如果是 NULL 的話,Request.IsAuthenticated 就會丟 false 才對。

    OR, 試試 HttpContext.Current ?


    小人物一枚。
    • 已標示為解答 dan0605 2009年4月29日 上午 03:36
    2009年4月28日 上午 06:05
    版主

所有回覆

  • 基本上 Request.IsAuthenticated 會傳回 true,必須要通過三個條件:

    1. HttpContext.Current.User 不是 NULL
    2. HttpContext.Current.User.Identity 不是 NULL
    3. HttpContext.Current.User.Identity.IsAuthenticated 是 true

    有一個條件不符合,就會傳回 false。

    你的問題有可能是你取的不是 HttpContext.Current 所回傳的 HttpContext 物件。
    小人物一枚。
    • 已標示為解答 dan0605 2009年4月29日 上午 03:36
    2009年4月28日 上午 03:35
    版主
  • 朱大的速度太快了吧,是秒殺嗎?呵.

    首先,謝謝您的回覆!

    剛漏說了.Context.User.Identity 的部份,因有改寫IIdentity的部份
    public class MyIdentity : IIdentity,

    所以,有可能是在改寫的Identity中出現問題嗎? 請再指引一方向!

    謝謝!

    ps. 因Identity 是前工程師開發的,所以..

    2009年4月28日 上午 03:41
  • 我想可能與改寫的 Identity 無關。
    你要循那三個檢查點去找,才有可能會發現問題。
    小人物一枚。
    2009年4月28日 上午 04:10
    版主
  • 再次謝謝!

    但目前我所遇問題是
    Request.IsAuthenticated 回傳是 true的情形下,但Context.User.Identity讀取出來是null值.
    概略的程式碼如下:

            if (Request.IsAuthenticated)
            {
                MyIdentity id = Context.User.Identity as MyIdentity;
                if (id != null){
    		lbltext.Text = id.NickName;
                }
            }
    發生問題的情形為 Request.IsAuthenticated = true ;
    但在MyIdentity id = context.User.Identity as MyIdentity : -->有時會出現[並未將物件參考設定為物件的執行個體]的錯誤,而且是有時,並非每次!
    登入後是有記錄Cookie,並保留7天.

    目前無法判定,是什麼情形,還請朱大協助給個提示..謝謝您!



    2009年4月28日 上午 05:58
  • 你要不要用除錯器看看 Context.User 本身是不是 NULL ...

    不過這狀況確實有點奇怪,因為 Context.User 如果是 NULL 的話,Request.IsAuthenticated 就會丟 false 才對。

    OR, 試試 HttpContext.Current ?


    小人物一枚。
    • 已標示為解答 dan0605 2009年4月29日 上午 03:36
    2009年4月28日 上午 06:05
    版主
  • 不好意思,問個蠢問題.

    這二個用法有什麼不同呢?在網路上查,是說
    一是靜態方法,另一個是需要實體化的..

    但不知何時用什麼較好呢? 勞煩了..問題很多..呵...@@


    Dan

    2009年4月28日 上午 06:20
  • Request.IsAuthenticated 是來自 HttpRequest,ASP.NET 在初始化它時會傳入 HttpContext.Current,它回傳的即時傳入的 HttpContext 中的那三個條件。

    Context.User 是來自 Page,巧的是它也是 HttpContext.Current,因此老實說不太有可能會出現 HttpContext.Current = null 又會讓 Request.IsAuthenticated 是 true 的狀況。

    我個人都是直接取用 HttpContext.Current 來做,而不是用 Page.Context。
    小人物一枚。
    2009年4月28日 上午 07:06
    版主
  • 朱大,感謝,改用了HttpContext.Current 目前未再出現那個錯誤訊息了!
    2009年4月29日 上午 03:39
  • 朱大, 好:

            Trace 到可能真的問題所在,前面有述說.因有改寫IIdentity及IPrincipal ,所以在讀取
    HttpContext.Current.User.Identity  或是 Context.User.Identity 時,因為轉型為自己實作的 Identity時
    出現NULL的情形,不知是什麼情形呢?


                MyIdentity id = Context.User.Identity as MyIdentity;
                if (id != null){
    		lbltext.Text = id.NickName;
                }
    謝謝!
    2009年4月30日 上午 09:33