Как использовать фильтр действий в ASP.NET MVC для маршрутизации в другое представление, но с использованием того же URL-адреса? - PullRequest
2 голосов
/ 29 сентября 2011

Можно ли создать фильтр, который после (в основном) обработки действия контроллера проверяет определенное условие теста и прозрачно направляет пользователю другое представление (т. Е. Не изменяет URL)?1001 *

Вот мое предположение на некоторый псевдокод:

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        // If some condition is true
        //  Change the resulting view resolution to XYZ

        base.OnResultExecuting(filterContext);
    }

Ответы [ 4 ]

7 голосов
/ 29 сентября 2011
filterContext.Result = new ViewResult
{
    ViewName = "~/Views/SomeController/SomeView.cshtml"
};

Это приведет к короткому замыканию при выполнении действия.

1 голос
/ 30 сентября 2011

также вы можете вернуть вид из вашего действия

  public ActionResult Index()
                {
                    return View(@"~/Views/SomeView.aspx");
                }
0 голосов
/ 14 декабря 2011

Это то, что я в итоге сделал, и заключил его в повторно используемый атрибут, и самое главное, он сохраняет исходный URL при перенаправлении (или применении любого желаемого результата) в зависимости от ваших требований:

public class AuthoriseSiteAccessAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        // Perform your condition, or straight result assignment here.
        // For me I had to test the existance of a cookie.
        if (yourConditionHere)
            filterContext.Result = new SiteAccessDeniedResult();
    }

}

public class SiteAccessDeniedResult : ViewResult
{
    public SiteAccessDeniedResult()
    {
        ViewName = "~/Views/SiteAccess/Login.cshtml";
    }
}

Затем просто добавьте атрибут [SiteAccessAuthorise] к вашим контроллерам, к которым вы хотите применить авторизационный доступ (в моем случае), или добавьте его в BaseController. Убедитесь, что хотя действие, которое вы перенаправляете на базовый контроллер, не имеет атрибута, иначе вы попадете в бесконечный цикл!

0 голосов
/ 30 сентября 2011

Я расширил AuthorizeAttribute фильтра действий ASP.NET MVC как DCIMAuthorize, в котором я выполняю некоторые проверки безопасности, и если пользователь не аутентифицирован или не авторизован, тогда фильтр действий приведет пользователя к доступу к запрещенной странице. Моя реализация, как показано ниже:

public class DCIMAuthorize : AuthorizeAttribute
{

    public string BusinessComponent { get; set; }

    public string Action { get; set; }
    public bool ResturnJsonResponse { get; set; }
    public bool Authorize { get; set; }

    public DCIMAuthorize()
    {
        ResturnJsonResponse = true;
    }
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {

        try
        {
            //to check whether user is authenticated
            if (!httpContext.User.Identity.IsAuthenticated)
                return false;
            //to check site level access
            if (HttpContext.Current.Session["UserSites"] != null)
            {
                var allSites = (VList<VSiteList>)HttpContext.Current.Session["UserSites"];
                if (allSites.Count <= 0)
                    return false;
            }
            else
                return false;

            // use Authorize for authorization
            Authorize = false;

            string[] roles = null;
            //get roles for currently login user
            if (HttpContext.Current.Session["Roles"] != null)
            {
                roles = (string[])HttpContext.Current.Session["Roles"];
            }

            if (roles != null)
            {
                //for multiple roles
                string[] keys = new string[roles.Length];
                int index = 0;
                // for each role, there is separate key
                foreach (string role in roles)
                {
                    keys[index] = role + "-" + BusinessComponent + "-" + Action;
                    index++;
                }

                //access Authorization Details and compare with keys  
                if (HttpContext.Current.Application["AuthorizationDetails"] != null)
                {
                    Hashtable authorizationDetails = (Hashtable)HttpContext.Current.Application["AuthorizationDetails"];

                    bool hasKey = false;
                    foreach (var item in keys)
                    {
                        hasKey = authorizationDetails.ContainsKey(item);
                        if (hasKey)
                        {
                            Authorize = hasKey;
                            break;
                        }
                    }

                }
            }
            return base.AuthorizeCore(httpContext);
        }
        catch (Exception)
        {

            throw;
        }
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        try
        {
            filterContext.Controller.ViewData["ResturnJsonResponse"] = ResturnJsonResponse;
            base.OnAuthorization(filterContext);
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                // auth failed, redirect to login page
                filterContext.Result = new HttpUnauthorizedResult();

                return;
            }

            if (!Authorize)
            {
                //Authorization failed, redirect to Access Denied Page
                filterContext.Result = new RedirectToRouteResult(
                   new RouteValueDictionary{{ "controller", "Base" },
                                             { "action", "AccessDenied" }
                                             //{ "returnUrl",    filterContext.HttpContext.Request.RawUrl }
                                            });
            }
        }
        catch (Exception)
        {

            throw;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...