簡體   English   中英

重定向到“您被禁止”頁面而不更改URL ASP.NET MVC

[英]Redirect to “You Are Forbidden” page without changing URL ASP.NET MVC

我在項目中設置了自定義授權屬性,以對用戶權限進行一些檢查。 如果不允許他們進行某些活動,則會通過RedirectToRouteResult其重定向到“您被禁止”頁面。 但是,我想在不更改URL的情況下實現此功能,以便用戶在獲得許可后可以刷新頁面。 這可能嗎?

我目前的狀況。 它將發送到URL Forbidden/

[AttributeUsage(AttributeTargets.Method)]
public class AuthActivityAttribute : ActionFilterAttribute
{
    public string ActivityName { get; set; }
    public int ActivityId = 0;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!ViewIsAuthorizedActivity(ActivityName))
        {
            filterContext.Result = Forbid();
            base.OnActionExecuting(filterContext);
        }
    }

    public RedirectToRouteResult Forbid()
    {
        return new RedirectToRouteResult(
            new RouteValueDictionary
                {
                    { "controller", "Home" },
                    { "action", "Forbidden" },
                    { "Activity", ActivityId },
                    { "area", ""}
                });
    }
    // other stuff
}

編輯/解決方案:

我最終將渲染PartialView用於GET請求和RedirectToRouteResult用於POST請求結合起來使用。 我之所以選擇它,有兩個原因:

  1. 用戶在失去權限之前已加載頁面,因此未加載“禁止的部分視圖”。 在POST上沒有RedirectToRouteResult情況下,即使沒有權限,它們也可以進行POST。

  2. 如果有人點擊某些“包含”值,則可能會嘗試在頁面上過分張貼並取得一些成功。

屬性:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (!ViewIsAuthorizedActivity(ActivityName))
    {
        string requestMethod = filterContext.HttpContext.Request.HttpMethod;

        if (requestMethod == "GET")
        {
            filterContext.Controller.ViewBag.Authorization = "FORBIDDEN";
        }
        else if (requestMethod == "POST")
        {
            filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
                {
                    { "controller", "Foo" },
                    { "action", "Bar" },
                    { "area", ""}
                });
        }

        base.OnActionExecuting(filterContext);
    }
}

視圖:

@if (ViewBag.Authorization == "FORBIDDEN")
{
    ViewBag.Title = "Forbidden!";
    @Html.Partial("~/Views/Home/Forbidden.cshtml");
}
else
{
    <!-- Page -->
}

偏的是要走的路。 將部分內容添加到您的頁面,如下所示:

@if(ViewData["FORBIDDEN"] == true)
{

<div id="forbidden">

<div/>
}
else{
rest of page here
}

在您的操作中檢查權限並基於它設置ViewData [“ FORBIDDEN”]

暫無
暫無

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

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