जब आप स्रोत कोड (http://aspnetwebstack.codeplex.com/ पर उपलब्ध) देखते हैं तो आप देखते हैं कि मानक फ़िल्टर कक्षाओं के साथ यह संभव नहीं है। IAuthorizationFilter
कार्यान्वयन हमेशा IActionFilter
कार्यान्वयन से पहले निष्पादित किए जाते हैं। ऐसा इसलिए है क्योंकि प्राधिकरण फ़िल्टर परिणाम लौटाते समय एक्शन फ़िल्टर नहीं चलेंगे।
इस हल करने के लिए आप अपने खुद के ControllerActionInvoker
वंशज वर्ग बना सकते हैं और InvokeAction
विधि ओवरराइड कर सकते हैं:
public class MyControllerActionInvoker : ControllerActionInvoker
{
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
// Your initialization code here
try
{
return base.InvokeAction(controllerContext, actionName);
}
finally
{
// Your finalization code here
}
}
}
आप ControllerFactory
वर्ग एक कस्टम में अपने नियंत्रकों में अपना कस्टम MyControllerActionInvoker
वर्ग इंजेक्षन करने की जरूरत है:
public class MyControllerFactory : DefaultControllerFactory
{
private readonly MyControllerActionInvoker actionInvoker = new MyControllerActionInvoker();
/// <summary>
/// Retrieves the controller instance for the specified request context and controller type.
/// </summary>
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
var controllerInstance = base.GetControllerInstance(requestContext, controllerType);
if (controllerInstance != null)
{
var typedController = controllerInstance as Controller;
if (typedController != null)
{
typedController.ActionInvoker = this.actionInvoker;
}
}
return controllerInstance;
}
}
और निश्चित रूप से अब आपको एमवीसी ढांचे के साथ अपना खुद का MyControllerFactory
पंजीकृत करना होगा। जहां आप भी अपने मार्गों को पंजीकृत आपको यह करना चाहिए:
var controllerFactory = new MyControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
इस कार्यान्वयन ठीक काम करता है यहाँ।
स्रोत
2012-08-27 19:47:39
प्राधिकरण फ़िल्टर जांचता है कि उपयोगकर्ता को अनुमति है या नहीं, तो अगर कोई नहीं है तो कुछ और जांच नहीं है। ऐसा लगता है जैसे आप कुछ अजीब कर रहे हैं। शायद समझाओ कि आप उन्हें स्वैप क्यों करना चाहते हैं। –
वैसे एक्शन फ़िल्टर जांचता है कि किसी विशेष उपयोगकर्ता के पास अस्थायी पासवर्ड है या नहीं, इसलिए मैं उन्हें "पासवर्ड बदलें" पृष्ठ पर रीडायरेक्ट करने के लिए रीडायरेक्ट करना चाहता हूं और "अनधिकृत" कहता हूं। उम्मीद है कि समझ में आता है ... – davey1990
उस मामले में ऐसा लगता है कि आप चाहते हैं कि अस्थायी पासवर्ड वाले लोग अभी भी प्राधिकरण जांच में असफल हो जाएं, लेकिन अगर आपके पास एक अस्थायी पासवर्ड है, तो बस अपने "अनधिकृत" पृष्ठ में जांचना चाहते हैं, और " उस मामले में पासवर्ड बदलें "पृष्ठ। वैकल्पिक रूप से, आप इसे लॉगिन पर पकड़ सकते हैं और उन्हें लॉगिन करने की अनुमति देने से पहले अपना पासवर्ड बदलने के लिए मजबूर कर सकते हैं। तो आपको चिंता करने की ज़रूरत नहीं है। –