簡體   English   中英

在不更改url的情況下顯示自定義頁面

[英]Getting a custom page to show without changing the url

當用戶嘗試訪問不應訪問的內容時,我想顯示一個頁面。 此限制是在自定義中間件中檢查的。 當中間件返回一個false並且新控制器被調用時,我不想更改客戶端的url。

這是我的中間件檢查:

public async Task Invoke(HttpContext context, IAutorisationService service)
        {
            var user = service.CreateUserModel(context);
            var page = service.CreatePageModel(context);
            context.Items.Add("CurrentUser", user);

            if (service.UserAllowedToPage(user, page))
                await _next.Invoke(context);
            else
            {
                context.Response.Redirect("/Error/CustomError");
            }
        }

這是錯誤控制器:

public IActionResult CustomError()
        {
            if (!HttpContext.Items.TryGetValue("CurrentUser", out var o) || !(o is UserModel userModel))
            {
                return View();
            }

            if (userModel.IsSuperUser)
            {
                return View();
            }

在這里返回的視圖都工作正常。

這是我的startup.cs(我現在在這里掙扎):

app.UseMvc(routes =>
            {
                //routes.MapRoute(
                    //name: "ErrorRoute",
                    //template: "{controller=Error}",
                    //defaults: new {controller = "Error", action = "CustomError"});

                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

            });

我在網上找到的任何組合似乎都無法正確實現。

更新資料

好的,因此我對政策沒有進一步的了解。 我將嘗試更好地解釋我的情況:我在管道末尾(在app.UseMvc之前)有一個自定義中間件,該中間件具有異步Task Invoke方法,該方法在另一個類中調用布爾運算符。 現在,如果布爾值返回true,則中間件任務執行以下操作: await _next.Invoke(HttpContext) ,如果該布爾值返回false,我希望中間件執行異常。 並且當引發異常時,我想要: app.UseExceptionHandler("/Error/CustomError"); app.UseStatusCodePagesWithReExecute("/Error/CustomError"); 捕獲它並在ErrorController中激活CustomError操作,然后返回一個自定義視圖。 這有可能嗎? (對不起,如果我的第一個問題還沒有完成)

嗨,您可以使用返回錯誤視圖

return View("Error")

您可以檢查所需的內容,如果出現問題,可以代替主視圖,然后返回錯誤視圖

您不能重定向到頁面,而無需更改URL。 重定向實際上發生在客戶端。 服務器僅發送帶有包含備用URL的Location標頭的302響應。 客戶有責任實際請求該備用URL,這是瀏覽器默認執行的操作。 結果,瀏覽器實際上將請求/Error/CustomError

您需要做的是直接從中間件返回實際的錯誤響應,以使URL保持原樣。 但是,實際上,中間件在這里是錯誤的方法。

相反,您應該使用內置的授權框架。 您可以通過實現需求和處理程序,然后使用Authorize屬性引用該策略,將自定義策略應用於控制器/操作。

[Authorize(Policy = "MyPolicy")]
public IActionResult MyProtectedAction()

然后,當用戶不符合策略要求時,他們將陷入異常處理中間件,在中間件中,您可以通過配置app.UseStatusCodePagesWithReExecute來綁定自定義視圖:

public class Startup
{
    ...

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStatusCodePagesWithReExecute("/error/{0}");

        ...
    }
}

然后將執行為/error/{0}路由定義的控制器和操作,而不會影響URL(“ ReExecute”部分)。 {0}位將被替換為HTTP狀態代碼,該狀態代碼將為401 Unauthorized 因此,您可以按照字面上的方式將操作綁定到/error/401或使用/error/{statusCode}類的路由來捕獲所有操作,然后在狀態代碼內分支以處理多種不同的錯誤類型。 對於它的價值,這也是您提供自定義404頁,500頁等的方式。

有關更多信息,請參見:

暫無
暫無

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

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