[英]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.