9

पर काम नहीं कर रहा है मैंने नियंत्रक के लिए ओवरराइड किया है जो जांचता है कि कुछ सत्र डेटा मौजूद है या नहीं। भंडार के लिए यह डेटा ठीक से काम करने के लिए आवश्यक है, इसलिए यदि यह मौजूद नहीं है तो जांच के बाद उपयोगकर्ता को लॉग ऑफ होना चाहिए।नियंत्रक से रीडायरेक्ट

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    if (Session["CompanyID"] != null) 
    { 
     repo.CompanyID = (long)Session["CompanyID"]; 
    } 
    else 
    { 
     RedirectToAction("LogOff", "Account"); 
    } 
} 

मेरे कोड इस तरह दिखता है, लेकिन फिर भी जब RedirectToAction शुरू हो जाती है नियंत्रक अभी भी डिफ़ॉल्ट कार्रवाई को खोलता है और उपयोगकर्ता लॉग ऑफ नहीं है। क्या आप इस समस्या को संभालने के तरीके पर सिफारिश कर सकते हैं?

मैं इस सत्र डेटा का इस तरह से उपयोग कर रहा हूं क्योंकि यह पहली जगह है जिसे मैं प्राप्त कर सकता हूं, मुझे पता है और यहां मैं यह जांच सकता हूं कि यह विशेष डेटा मौजूद है या नहीं। यह तब लिखा जाता है जब उपयोगकर्ता लॉग इन करता है।

यह डेटा डेटाबेस में उपयोगकर्ता का एक हिस्सा है। मैंने एक कस्टम सदस्यता और भूमिका प्रदाता बनाया है। क्या इस डेटा को सदस्यता यूज़र प्रकार के "उपयोगकर्ता" में जोड़ने का कोई तरीका है, इसलिए इसे उपयोगकर्ता नाम जैसे कन्स्ट्रक्टर में एक्सेस किया जा सकता है?

उत्तर

12

इसके बजाय एक कस्टम ActionFilter का उपयोग करने पर विचार करें।

public class HasCompanyIdAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Session["CompanyID"] == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"})); 
     } 
    } 
} 

यह तो इतनी के रूप में लागू किया जा सकता:

[HasCompanyId] 
public class MyController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 

यह सभी अनुरोधों MyController (या उपवर्गों है) संभालती है कि के लिए विशेषता लागू होगा।

+0

मैं सिद्धांत को समझता हूं, लेकिन यह थोड़ा अवांछित लगता है। मैं इसे वैश्विक फ़िल्टर नहीं कर सकता क्योंकि आवेदन के सार्वजनिक क्षेत्र हैं, और फिर मुझे इसे उस क्षेत्र के अंदर की हर क्रिया पर लागू करना होगा जिसके लिए इसकी आवश्यकता है? क्या प्रारंभ करने के बाद नियंत्रक के लोडिंग को तोड़ने और इसे किसी अन्य नियंत्रक की दूसरी कार्रवाई में भेजने का कोई अन्य तरीका है? – Zaak

+0

आप एक नियंत्रक को विशेषता लागू कर सकते हैं, और यह उस नियंत्रक, या नियंत्रक बेस क्लास के भीतर प्रत्येक क्रिया के लिए लागू किया जाएगा और फिर प्रत्येक व्युत्पन्न कक्षाओं के कार्यों के लिए कार्रवाई भी लागू की जाएगी! –

+0

हम्म, इस तरह से अभी भी इस तथ्य को संबोधित नहीं करता है कि मुझे इसे एक बार सेट करना है। ऐसा लगता है कि फ़िल्टर एट्रिब्यूट के माध्यम से चीजें करने से इस तरह से जब भी नियंत्रक को तुरंत चालू किया जाता है, तो इसे हर बार एक क्रिया निष्पादित करता है? – Zaak

2

इसके बजाय बेस क्लास में ऑनएक्शन एक्स्क्टिंग को ओवरराइड करके अपने समाधान को लागू करें। फिर आप एक्शन फ़िल्टर में जो कुछ भी कर सकते हैं वह कर सकते हैं। इस तरह:

public void OnActionExecuting(ActionExecutingContext filterContext){ 
    if (filterContext.HttpContext.Session["CompanyID"] != null) 
    repo.CompanyID = (long)filterContext.HttpContext.Session["CompanyID"]; 
    else 
    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"})); 
} 

ब्रेवटी के लिए छोड़ा गया कुछ कोड।

मैंने दोनों दृष्टिकोणों की कोशिश की और एक एक्शन फ़िल्टर के माध्यम से इसे लागू करने के लिए पाया गया निर्भरता इंजेक्शन आवश्यकताओं के कारण अधिक जटिल था। आप इसे किसी भी तरह से कर सकते हैं लेकिन महसूस किया कि बेस क्लास दृष्टिकोण थोड़ा स्पष्ट था। मैं दोहराव कोड को बचाने के लिए नियंत्रक विधियों के लिए कुछ मानक ऑब्जेक्ट्स उपलब्ध कराने के लिए बेस क्लास पर कुछ गुण सेट करना चाहता था, डीवी क्रियाओं में जोड़ रहे थे। बेस क्लास दृष्टिकोण ने इसे आसान बना दिया।

एक चेतावनी जो मैं जोड़ूंगा, मैं यह सुझाव नहीं दे रहा हूं कि यह प्रमाणीकरण/सुरक्षा के लिए एक अच्छा दृष्टिकोण है, मैं इसे क्रिया निष्पादन से पहले कुछ संचालन/सत्यापन करने की इच्छा रखने के परिप्रेक्ष्य से देख रहा हूं और डीआरवाई सिद्धांत का पालन करने के लिए नियंत्रक उदाहरण पर कुछ पूर्व-जनसंख्या वाले डेटा को भी स्थापित करना।

उम्मीद है कि यह मदद करता है।

संबंधित मुद्दे