Asp.net

如何從 ASP.NET MVC 中的表單身份驗證中攔截 401?

  • February 10, 2014

如果使用者沒有正確的權限,我想生成一個 401 頁面。

使用者請求一個 url 並被重定向到登錄頁面(我在 web.config 中拒絕了所有匿名)。使用者登錄成功並被重定向到原始 url。但是,經過權限檢查,確定使用者沒有所需的權限,所以我想生成一個 401。但是 Forms Authentication 總是處理 401 並將使用者重定向到登錄頁面。

對我來說,這是不正確的。使用者已經通過身份驗證,使用者只是沒有適當的授權

在其他場景中,例如在 ajax 或 REST 服務場景中,我絕對不想要登錄頁面——我需要正確的 401 頁面。

到目前為止,我已經嘗試自定義授權過濾器以返回 401 的 ViewResult 但沒有奏效。然後我嘗試了一個普通的動作過濾器,覆蓋了 OnActionExecuting,它也不起作用。

我能夠做的是處理 global.asax 中的一個事件,PostRequestHandlerExecute,並檢查權限,然後直接寫出響應:

if (permissionDenied)
{
   Context.Response.StatusCode = 401;
   Context.Response.Clear();
   Context.Response.Write("Permission Denied");
   Context.Response.Flush();
   Context.Response.Close();
   return;
}

那行得通,但這並不是我真正想要的。首先,我什至不確定這是否是正確的事件或正在籌備中的地方。其次,我希望 401 頁面有更多的內容。最好,它應該是一個 aspx 頁面,其母版頁可能與站點的其餘部分相同。這樣,任何瀏覽該站點的人都可以看到權限被拒絕但具有相同的外觀和感覺等,但 ajax 或服務使用者將獲得正確的狀態程式碼以進行操作。

知道如何實現嗎?我看過其他有類似請求的文章,但沒有看到我可以使用的解決方案。

不,我不想要 403。

我找到了一個可行的解決方案。

在EndRequest期間發生FormsAuthenticationModule的 401 重定向。由於在事件處理期間模組在global.asax之前被呼叫,我們可以在**FormsAuthenticationModule處理請求之後覆蓋狀態程式碼。

在我的自定義 AuthorizationFilter 中,我設置了HttpContext.Items$$ “PermissionDenied” $$為 true 然後在我的global.asax EndRequest中,我將狀態程式碼從 200 翻轉到 401。然後我Server.Transfer到我的自定義 PermissionDenied 視圖。

我仍然希望FormsAuthenticationModule本身已更新以處理這種情況,但我認為這並不太老套,我認為我可以忍受它。

顯然,您可以更改表示global.asax應該翻轉狀態程式碼的方式。我只是嘗試將狀態程式碼設置為 511 之類的東西,並將其用作條件而不是HttpContext.Items並且效果也很好。我猜只要正確的狀態程式碼出現在門外,ASP.NET 引擎就不會在意。

引用自:https://stackoverflow.com/questions/2931791