2009-06-03 7 views
5

मैं जैसे कुछ कार्रवाई तरीकों एक अधिकृत पीछे है:एएसपी.नेट एमवीसी के प्राधिकरण पर अधिक नियंत्रण; रखने के लिए AJAX अनुरोध करता AJAXy

[AcceptVerbs(HttpVerbs.Post), Authorize] 
public ActionResult Create(int siteId, Comment comment) { 
समस्या मेरे पास है

कि मैं टिप्पणी करने के लिए AJAX के माध्यम से अनुरोध भेज रहा है/साथ बनाएं

X-Requested-With=XMLHttpRequest 

जो AJAX के रूप में अनुरोध की पहचान करने में मदद करता है। जब उपयोगकर्ता लॉग इन नहीं होता है और प्राधिकृत दीवार को हिट करता है तो इसे

जो AJAX वर्कफ़्लो को तोड़ता है। मुझे

/Account/LogOn?X-Requested-With=XMLHttpRequest 

किसी भी विचार को कैसे प्राप्त किया जा सकता है? प्राधिकरण से अनुरोध होने पर क्या होता है, इस पर अधिक नियंत्रण पाने के किसी भी तरीके?

उत्तर

5

लुईस टिप्पणी के लिए धन्यवाद मैं (, मेरी अपनी टिप्पणी के साथ पोस्ट, अगर आपके पास फिक्स संपादित करें और इस वाक्यांश को दूर करने के लिए स्वतंत्र महसूस जो सही से दूर) इस समाधान तक पहुँचने में सक्षम था, लेकिन यह काम करता है:

public class AjaxAuthorizeAttribute : AuthorizeAttribute { 
    override public void OnAuthorization(AuthorizationContext filterContext) { 
     base.OnAuthorization(filterContext); 
     // Only do something if we are about to give a HttpUnauthorizedResult and we are in AJAX mode. 
     if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest()) { 
      // TODO: fix the URL building: 
      // 1- Use some class to build URLs just in case LoginUrl actually has some query already. 
      // 2- When leaving Result as a HttpUnauthorizedResult, ASP.Net actually does some nice automatic stuff, like adding a ReturnURL, when hardcodding the URL here, that is lost. 
      String url = System.Web.Security.FormsAuthentication.LoginUrl + "?X-Requested-With=XMLHttpRequest"; 
      filterContext.Result = new RedirectResult(url); 
     } 
    } 
} 
+0

महान उदाहरण। लेकिन आधार का परीक्षण कैसे करें। अनधिकृतता (फ़िल्टरकॉन्टेक्स्ट); मंगलाचरण? – Ofigenn

+0

इस समस्या के लिए एक और अपवाद [केविन क्राफ्ट] द्वारा वर्णित है (http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/) – Towa

1

प्राधिकृत विशेषता का उपयोग करने के बजाय, मैं निम्नलिखित की तरह कुछ कर रहा हूं।

public ActionResult SomeCall(string someData) 
{ 
    if (Request.IsAjaxRequest() == false) 
    { 
     // TODO: do the intended thing. 
    } 
    else 
    { 
     // This should only work with AJAX requests, so redirect 
     // the user to an appropriate location. 
     return RedirectToAction("Action", "Controller", new { id = ?? }); 
    } 
} 
+0

मुझे वह हिस्सा पहले ही काम कर चुका है। मेरी समस्या यह है कि उस विधि के सामने एक प्राधिकरण है और प्राधिकरण की पुनर्निर्देशन आपके द्वारा किए गए AJAX के लिए जांच की जाने वाली क्षमता को खो देता है। – Pablo

0

मुझे लगता है कि इसे संभालने का सही तरीका आपके जावास्क्रिप्ट में AJAX कॉल करने वाला होगा।

यदि उपयोगकर्ता को अधिकृत होने की आवश्यकता है (या आपके कोड के रूप में प्रमाणित है) और नहीं, तो आपको उन्हें सूचित करना चाहिए और शायद उन्हें पहले स्थान पर प्रयास करने और टिप्पणी करने की अनुमति नहीं देनी चाहिए।

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

+0

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

+0

मेरा बुरा, अब मुझे यह मिल गया है। सही दिशा में सूचक के लिए धन्यवाद लुईस। – Pablo

3

हाल ही में मैं एक ही समस्या में भाग गया और जे। पाब्लो फर्नांडीज द्वारा पोस्ट किए गए कोड का उपयोग वापसी URL के लिए एक संशोधन के साथ किया। यहां यह है:

public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute 
{ 
    override public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     // Only do something if we are about to give a HttpUnauthorizedResult and we are in AJAX mode. 
     if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      // TODO: fix the URL building: 
      // 1- Use some class to build URLs just in case LoginUrl actually has some query already. 
      HttpRequestBase request = filterContext.HttpContext.Request; 
      string returnUrl = request.Path; 
      bool queryStringPresent = request.QueryString.Count > 0; 
      if (queryStringPresent || request.Form.Count > 0) 
       returnUrl += '?' + request.QueryString.ToString(); 
      if (queryStringPresent) 
       returnUrl += '&'; 
      returnUrl += request.Form; 
      String url = System.Web.Security.FormsAuthentication.LoginUrl + 
         "?X-Requested-With=XMLHttpRequest&ReturnUrl=" + 
         HttpUtility.UrlEncode(returnUrl); 
      filterContext.Result = new RedirectResult(url); 
     } 
    } 
} 
संबंधित मुद्दे