簡體   English   中英

ASP.NET MVC和Angular:會話Cookie過期時,自定義屬性/ ActionFilter希望它重定向到“登錄”頁面,但並不總是起作用

[英]ASP.NET MVC & Angular: Custom Attribute / ActionFilter when Session Cookies expire, want it to redirect to Login page but it doesn't always work

細節

我在Angular中使用ASP.NET MVC。 如果我進行硬刷新(F5),它將達到我創建的屬性就可以了。當會話cookie存在時,也可以對其進行訪問。 但是說用戶在某個頁面上,並且會話cookie在他在頁面上時就過期了。代碼仍然可以訪問我的Angular代碼,但是一旦它應該首先命中我的Controller或我的Attribute,它就不會訪問。 因此,此時網頁上沒有任何內容,也不會重定向到“登錄”屏幕。

我也在附近搜索並搜索了該網站,但沒有找到任何有效的方法。

我的密碼

AccountController以外的我所有控制器的屬性(由於某種原因,它會導致重定向循環?)。 我將此放在所有控制器的頂部。

[CustomFilters.VerifySession]

我的自定義屬性

public class CustomFilters
{
    public class VerifySessionAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var userId = filterContext.HttpContext.Session["UserId"];
            var userName = filterContext.HttpContext.Session["UserName"];

            if (userId == null || userName == null)
                filterContext.Result = new RedirectResult(string.Format("/Account/Login"));
        }
    }
}

我的登錄功能

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
    ...
    Session["UserId"] = UserId;
    Session["UserName"] = sql.UserProfiles.Where(c => c.UserId == UserId).Select(x => x.UserName).FirstOrDefault();
    ...
}

Web.config

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="1" />  //set to 1 just for testing purposes
    </authentication>
    <sessionState timeout="1" />  //set to 1 just for testing purposes
</system.web>

沒有足夠的細節來了解正在發生的事情,因此有一些想法:

首先,表單身份驗證模塊將在未經身份驗證的請求到達您的過濾器或控制器之前重定向。 它的工作方式是表單模塊將攔截應用程序中任何位置生成的任何401未經身份驗證的響應,並將其替換為302重定向到登錄頁面的內容。

其次,這些重定向不適用於ajax請求。 您沒有提到是否在瀏覽器的開發工具中檢查了響應,但是如果您發送帶有過期cookie的ajax請求,瀏覽器自動遵循由forms模塊發出的重定向,但實際上不會將用戶重定向到登錄頁面-相反,您只需在ajax請求中獲取登錄頁面的HTML作為響應數據即可。

因此,在我看來,您遇到的問題是,表單模塊正在將未經身份驗證的請求重定向到登錄頁面,但這僅對角度框架發出的Ajax請求無效。

基本上,您需要一些javascript代碼來識別何時收到未經身份驗證的響應,並實際上將頁面重定向到登錄頁面,而不是解析響應。 我自己的解決方案(不使用angular的)是簡單地對未經身份驗證的請求禁用302重定向,然后使用javascript處理401響應: 處理asp.net Web Api中未經身份驗證的請求的最佳方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM