অ্যাকশন ফিল্টার অ্যাট্রিবিউট থেকে পুনঃনির্দেশ করুন


139

কোনওটিতে পুনর্নির্দেশ করার সর্বোত্তম উপায় কী ActionFilterAttribute। আমি একজন আছে ActionFilterAttributeবলা IsAuthenticatedAttributeFilterএবং যে একটি সেশন ভেরিয়েবলের মান চেক। যদি ভেরিয়েবলটি মিথ্যা হয়, আমি আবেদনটি লগইন পৃষ্ঠায় পুনর্নির্দেশ করতে চাই to আমি রুটের নাম ব্যবহার করে পুনঃনির্দেশ করতে পছন্দ করব SystemLoginতবে এই মুহুর্তে কোনও পুনর্নির্দেশ পদ্ধতি ভাল হবে।


উত্তর:


187

ফিল্টারকন্টেক্সট.সেসটেল্ট সেট করুন

রুটের নাম সহ:

filterContext.Result = new RedirectToRouteResult("SystemLogin", routeValues);

আপনি এর মতো কিছু করতে পারেন:

filterContext.Result = new ViewResult
{
    ViewName = SharedViews.SessionLost,
    ViewData = filterContext.Controller.ViewData
};

আপনি যদি ব্যবহার করতে চান RedirectToAction:

আপনি RedirectToActionআপনার নিয়ামকটিতে একটি সার্বজনিক পদ্ধতি তৈরি করতে পারেন ( তার বেস নিয়ন্ত্রকের পক্ষে ) এটি কেবল সুরক্ষিতদের RedirectToActionথেকে কল করে System.Web.Mvc.Controller। এই পদ্ধতিটি যুক্ত করা আপনার RedirectToAction ফিল্টার থেকে সর্বজনীন কল করার অনুমতি দেয় ।

public new RedirectToRouteResult RedirectToAction(string action, string controller)
{
    return base.RedirectToAction(action, controller);
}

তারপরে আপনার ফিল্টারটি এর মতো দেখতে লাগবে:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var controller = (SomeControllerBase) filterContext.Controller;
    filterContext.Result = controller.RedirectToAction("index", "home");
}

8
এটি কাজ করে, তবে কি কোনও পুনর্নির্দেশতন্ত্র পদ্ধতি উপলব্ধ থাকা উচিত নয়?
বেন মিলস

@ বেনমিলস রয়েছে, তবে এটি protectedআপনার পক্ষে ফিল্টার থেকে অ্যাক্সেস না পেয়ে থাকবেন।
জেমস 10

10
এখন আমার প্রশ্ন হ'ল মাইক্রোসফ্ট কেন এই ফিল্টারটি করার সিদ্ধান্ত নিয়েছে protectedসেখানে কিছু যুক্তিসঙ্গত ব্যাখ্যা থাকতে হবে? RedirectToActionএটি কেন প্রথম স্থানে আবদ্ধ করা হয়েছিল তা না বুঝে এই অ্যাক্সেসযোগ্যতার পুনরায় সংজ্ঞা দেওয়া আমার কাছে খুব খারাপ লাগছে feel
ম্যাথু মার্লিন

2
@ ম্যাথিউমার্লিন - কোনও ক্রিয়ায় পুনর্নির্দেশের জন্য সঠিক উত্তরের জন্য সায়াকুরের উত্তর দেখুন। আপনি ঠিক বলেছেন যে কোনও অ্যাকশন ফিল্টার থেকে আপনাকে সরাসরি কোনও নিয়ামককে কল করা উচিত নয় - এটি টাইট কাপলিংয়ের সংজ্ঞা।
নাইটওয়েল 888

1
@ আকবারী আপনি কি বৈশিষ্ট্যের অর্ডার সম্পত্তি সেট করার চেষ্টা করেছেন? এছাড়াও ফিল্টারস্কোপ উইল ইফেক্ট এক্সিকিউশন অর্ডার।
ক্রিস

79

পুনঃনির্দেশের বিকল্প হিসাবে, যদি এটি আপনার নিজস্ব কোডকে কল করে তবে আপনি এটি ব্যবহার করতে পারেন:

actionContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary(new { controller = "Home", action = "Error" })
);

actionContext.Result.ExecuteResult(actionContext.Controller.ControllerContext);

এটি খাঁটি পুনর্নির্দেশ নয় তবে অপ্রয়োজনীয় ওভারহেড ছাড়াই অনুরূপ ফলাফল দেয়।


তুমি আমাকে সাহায্য কর ধন্যবাদ!
এডগার সালাজার

25
মনে রাখবেন যে আপনাকে actionContext.Result.ExecuteResultআপনার অ্যাকশন ফিল্টারের মধ্যে থেকে কল করা উচিত নয় - এমভিসি অ্যাকশন ফিল্টার চালানোর পরে এটি স্বয়ংক্রিয়ভাবে করবে (প্রদত্ত actionContext.Resultশূন্য নয়)।
নাইটওয়েল 888

12

আমি এমভিসি 4 ব্যবহার করছি, অনুমোদন লঙ্ঘনের পরে আমি কাস্টম এইচটিএমএল স্ক্রিনটিকে পুনর্নির্দেশ করতে নিম্নলিখিত পদ্ধতির ব্যবহার করেছি।

ওভাররাইড AuthorizeAttributeবলুন এবং প্রসারিত করুনCutomAuthorizerOnAuthorizationHandleUnauthorizedRequest

নিবন্ধন CustomAuthorizerমধ্যে RegisterGlobalFilters

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{

    filters.Add(new CustomAuthorizer());
}

unAuthorizedঅ্যাক্সেস কল সনাক্ত করার পরে HandleUnauthorizedRequestএবং নীচে প্রদর্শিত হিসাবে সম্পর্কিত নিয়ামক ক্রিয়ায় পুনর্নির্দেশ।


public class CustomAuthorizer : AuthorizeAttribute
{

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool isAuthorized = IsAuthorized(filterContext); // check authorization
        base.OnAuthorization(filterContext);
        if (!isAuthorized && !filterContext.ActionDescriptor.ActionName.Equals("Unauthorized", StringComparison.InvariantCultureIgnoreCase)
            && !filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.Equals("LogOn", StringComparison.InvariantCultureIgnoreCase))
        {

            HandleUnauthorizedRequest(filterContext);

        }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result =
       new RedirectToRouteResult(
           new RouteValueDictionary{{ "controller", "LogOn" },
                                          { "action", "Unauthorized" }

                                         });

    }
}

9

দেখে মনে হচ্ছে আপনি পুনরায় বাস্তবায়ন করতে চান, বা সম্ভবত প্রসারিত করতে চান AuthorizeAttribute। যদি তা হয় তবে আপনাকে নিশ্চিত করে নেওয়া উচিত যে আপনি ActionFilterAttributeএএসপি.নাইট এমভিসি আপনার পক্ষে আরও কাজটি করার সুযোগ দেবেন এবং এটি নয় inherit

এছাড়াও, আপনি অ্যাকশন পদ্ধতিতে আসল কোনও কাজ করার আগে আপনি নিশ্চিত হয়েছিলেন যে তা নিশ্চিত করতে চান - অন্যথায়, লগ ইন করা এবং না হয়ে কাজটির মধ্যে কেবল যে পৃষ্ঠাগুলি দেখবেন তা কেবলমাত্র সেইই পার্থক্য।

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        // Do whatever checking you need here

        // If you want the base check as well (against users/roles) call
        base.OnAuthorization(filterContext);
    }
}

এখানে আরও বিশদ সহ উত্তর সহ একটি ভাল প্রশ্ন রয়েছে O


5

নিম্নলিখিত স্নিপেট চেষ্টা করুন, এটি বেশ পরিষ্কার হওয়া উচিত:

public class AuthorizeActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(FilterExecutingContext filterContext)
  {
    HttpSessionStateBase session = filterContext.HttpContext.Session;
    Controller controller = filterContext.Controller as Controller;

    if (controller != null)
    {
      if (session["Login"] == null)
      {
        filterContext.Cancel = true;
        controller.HttpContext.Response.Redirect("./Login");
      }
    }

    base.OnActionExecuting(filterContext);
  }
}

এটি আমার জন্য কাজ করেছে, যদি কোনও ব্যবহারকারী কোয়েরি স্ট্রিংয়ের মানগুলি পরিবর্তন করার চেষ্টা করে এবং অ্যাকশনফিলারঅ্যাট্রিবিউট ব্যবহার করে আমি তাকে অননুমোদিত বার্তা পৃষ্ঠায় পুনঃনির্দেশিত করার চেয়ে তার / তার কাছে অনুমোদিত নয় এমন ডেটা অ্যাক্সেস করার চেষ্টা করে তবে আমাকে কোয়েরি স্ট্রিংয়ের মানগুলি পরীক্ষা করতে হবে।
সমীর

3

আপনি অ্যাজাক্স অনুরোধগুলি ব্যবহার করে থাকেন তবে এটি এমন একটি সমাধানও বিবেচনা করে যা এটি বিবেচনা করে।

using System;
using System.Web.Mvc;
using System.Web.Routing;

namespace YourNamespace{        
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeCustom : ActionFilterAttribute {
        public override void OnActionExecuting(ActionExecutingContext context) {
            if (YourAuthorizationCheckGoesHere) {               
                string area = "";// leave empty if not using area's
                string controller = "ControllerName";
                string action = "ActionName";
                var urlHelper = new UrlHelper(context.RequestContext);                  
                if (context.HttpContext.Request.IsAjaxRequest()){ // Check if Ajax
                    if(area == string.Empty)
                        context.HttpContext.Response.Write($"<script>window.location.reload('{urlHelper.Content(System.IO.Path.Combine(controller, action))}');</script>");
                    else
                        context.HttpContext.Response.Write($"<script>window.location.reload('{urlHelper.Content(System.IO.Path.Combine(area, controller, action))}');</script>");
                } else   // Non Ajax Request                      
                    context.Result = new RedirectToRouteResult(new RouteValueDictionary( new{ area, controller, action }));             
            }
            base.OnActionExecuting(context);
        }
    }
}

1

এটি আমার পক্ষে কাজ করে (এস্প নেট কোর ২.১)

using JustRide.Web.Controllers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace MyProject.Web.Filters
{
    public class IsAuthenticatedAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.User.Identity.IsAuthenticated)
                context.Result = new RedirectToActionResult(nameof(AccountController.Index), "Account", null);
        }
    }
}



[AllowAnonymous, IsAuthenticated]
public IActionResult Index()
{
    return View();
}

0

আপনি নিজের কন্ট্রোলারকে উত্তরাধিকারী করতে পারেন তারপরে এটি আপনার অ্যাকশন ফিল্টারের মধ্যে ব্যবহার করতে পারেন

আপনার অ্যাকশনফিলারঅ্যাট্রিবিউট শ্রেণীর ভিতরে:

   if( filterContext.Controller is MyController )
      if(filterContext.HttpContext.Session["login"] == null)
           (filterContext.Controller as MyController).RedirectToAction("Login");

আপনার বেস নিয়ামকের ভিতরে:

public class MyController : Controller 
{
    public void  RedirectToAction(string actionName) { 
        base.RedirectToAction(actionName); 
    }
}

কনস। এর মধ্যে সমস্ত নিয়ন্ত্রণকারীকে "মাইকন্ট্রোলার" শ্রেণি থেকে উত্তরাধিকার সূত্রে পরিবর্তন করা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.