2010-12-15 98 views
0

我試圖爲Asp.Net MVC2應用程序實現基於令牌的授權,並且我認爲我的方法是錯誤的。第一關:通過基於令牌的授權,我的意思是,當一個未經認證的用戶進入http://myapp.com/some/action?tok=[special single-use token here]他們在登錄使用表單身份驗證手動登錄用戶

所有在我的應用程序的控制器擴展了一個公共ApplicationController,所以我的方法是到控制器上覆蓋OnAuthorize。如下:

class ApplicationController 
{ 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.QueryString["tok"] != null) 
     { 
      var token = HttpUtility.UrlDecode(filterContext.HttpContext.Request.QueryString["tok"]); 

      if ((var user = getUserByToken(token)) != null) 
      { 
       FormsAuthentication.SetAuthCookie(user.Email, false); 
      } 
      else{ /* highly-proprietary handling of invalid token */ } 
     } 
     base.OnAuthorization(filterContext); 
    } 
} 

絕對肯定,當它應該和不被調用時,它不應該SetAuthCookie被調用。

問題是,這並沒有真正記錄用戶。它設置了一個cookie,這意味着我必須重定向(在調用SetAuthCookie之後User.Identity.IsAuthenticated仍然爲false)。但是關於此的整個想法是繼續請求正常並避免無意義的重定向。有什麼方法可以實現這個目標嗎?它似乎並不是一個很好的問...

回答

0

在你調用SetAuthCookie之後,User.Identity沒有任何變化。在下一次請求中,數據將成爲您所期望的。這裏要做的最好的事情是在SetAuthCookie被調用後發出重定向。

+0

有沒有一種好的方法來設置User.Identity,基本上強制立即登錄? – notJim 2010-12-15 20:53:02

+0

我不想說有沒有辦法,因爲我確定有(HttpContext.User可設置),但要做到完全正確,你會想做的一切,ASP.NET做的時候請求首先進入,如果是我,我會太擔心某些東西會被遺漏。在我看來,重定向是最安全的選擇。你可以重定向到同一個頁面(也可以忽略查詢字符串),它不必是一個不同的URL。 – 2010-12-15 20:57:35

+0

因爲基本上你所說的確保所有需要發生的事情,我現在就用重定向。看起來很奇怪,這樣做沒有什麼不同。我想看看是否有其他答案進來,但如果沒有,我想我會把它給雅:P。 – notJim 2010-12-15 21:49:56

相關問題