在我的應用程序,這是我們如何處理會話超時至今
大,這是在web.config中定義窗體身份驗證的正確方法
這是可能的
不,對不起,將javascript放在loginUrl
屬性中是沒有意義的。
或其他任何建議的方式來實現這一目標
從我瞭解你正在嘗試使用一些JavaScript函數來顯示登錄表單,如果會話已過期。
你應該兩種類型的請求區分到您的服務器:
- 標準同步請求(錨,形式,重定向,...)
- 異步請求(AJAX - 通過使用JavaScript實現)
在服務器端的這兩種情況下,您都應該通過使用[Authorize]
屬性修飾它們來保護需要身份驗證的操作。例如:
[Authorize]
public ActionResult SomeAction()
{
...
}
一旦你已經獲得你的服務器,你可以開始思考如何處理窗體身份驗證cookie到期或匿名用戶試圖調用這個動作的簡單情況。
對於標準同步調用服務器的第一種情況,表單身份驗證模塊將攔截請求,如果用戶未通過身份驗證或者會話過期,ASP.NET會自動將您重定向到您已定義的LogOn頁面loginUrl
屬性。它也將作爲ReturnUrl
查詢字符串參數傳遞給此操作,該操作將指向用戶原先請求的url並且尚未授權他。這個參數可以用來在他認證之後將他重定向回這個頁面。
現在第二種情況有點困難,因爲ASP.NET自動將請求重定向到LogOn頁面,您無法知道AJAX成功回調中用戶未被授權,並且服務器將請求重定向到LogOn頁面。菲爾哈克寫了一個excellent article
關於如何防止這種重定向的AJAX請求。我邀請你現在閱讀這篇文章。
好了,現在你已經閱讀文章,並且已經安裝了他的NuGet(Install-Package AspNetHaack
),你使用jQuery您的AJAX請求假設,你可以訂閱.ajaxComplete()
全局事件處理程序。在這個處理程序中,您可以測試服務器響應代碼,如果它是401,則表示該用戶未被授權。所以,你可以採取相應的行動。
<script type="text/javascript">
$(document).ajaxComplete(function(event, xhr, ajaxOptions) {
if (xhr.status == 401) {
// the AJAX request failed because either the user was not
// authenticated or his session expired. So here you could
// do whatever you want. For example you could redirect him
// to the loginUrl defined in your web.config file:
window.location.href = '@FormsAuthentication.LoginUrl';
// you also have the possibility to show this logon form
// inside a popup or render it inline inside the page,
// by sending an AJAX request to this action and retrieving the
// corresponding partial
}
});
</script>
感謝@Darin,其實我不允許:(我想我的問題也可以,如果我能先手運行定時器sitewise的方式解決使用包它應該無論當前打開哪個頁面,都可以在_layout.cshtml頁面中持續運行。 –
如果您不允許使用該軟件包,那麼只需從軟件包中獲取代碼並將其添加到你的項目,它是一個單一的文件。 –