我試圖爲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)。但是關於此的整個想法是繼續請求正常並避免無意義的重定向。有什麼方法可以實現這個目標嗎?它似乎並不是一個很好的問...
有沒有一種好的方法來設置User.Identity,基本上強制立即登錄? – notJim 2010-12-15 20:53:02
我不想說有沒有辦法,因爲我確定有(HttpContext.User可設置),但要做到完全正確,你會想做的一切,ASP.NET做的時候請求首先進入,如果是我,我會太擔心某些東西會被遺漏。在我看來,重定向是最安全的選擇。你可以重定向到同一個頁面(也可以忽略查詢字符串),它不必是一個不同的URL。 – 2010-12-15 20:57:35
因爲基本上你所說的確保所有需要發生的事情,我現在就用重定向。看起來很奇怪,這樣做沒有什麼不同。我想看看是否有其他答案進來,但如果沒有,我想我會把它給雅:P。 – notJim 2010-12-15 21:49:56