आपके AJAX कॉल अभी भी होने की संभावना सफल दिखाई दे रहा खत्म हो जाएगा का परिणाम (हालांकि, चिंता मत करो, यह वास्तव में अपनी कार्रवाई विधि पर अमल नहीं होगा), और अपने success
हैंडलर का आह्वान करें। ऐसा इसलिए है क्योंकि आप एचटीएमएल की उम्मीद कर रहे हैं, और यही वह है जो आप प्राप्त कर रहे हैं (यद्यपि, परिणामस्वरूप एचटीएमएल आपके लॉगिन पेज की संभावना है, न कि HTML जो आप चाहते थे)। एक तरफ, यदि आप JSON (dataType:'JSON'
का उपयोग करके) की अपेक्षा करते हैं, तो यह एक त्रुटि ट्रिगर करेगा, क्योंकि यह JSON को JSON के रूप में पार्स कर देगा।
आपको AJA अनुरोधों के लिए लॉगिन पृष्ठ को पुनर्निर्देशित करने से FormsAuth को रोकने की आवश्यकता है। अब, AuthorizeAttribute
ईमानदारी से NotAuthorizedResult
देता है, जो क्लाइंट को HTTP 401 अधिकृत नहीं है, जो आपके AJAX क्लाइंट के लिए आदर्श है।
समस्या यह है कि FormsAuth मॉड्यूल StatusCode की जांच करता है और यदि यह 401 है, तो यह रीडायरेक्ट करता है। मैं इस तरह से इस मुद्दे combatted है:
1) AuthorizeAttribute
के अपने खुद के व्युत्पन्न प्रकार बनाएं कि HttpContext.Items
में एक ध्वज स्थानों मुझे पता प्राधिकरण विफल जाने के लिए, और मैं एक रीडायरेक्ट के बजाय एक 401 के लिए मजबूर करना चाहिए:
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
/// <summary>
/// Processes HTTP requests that fail authorization.
/// </summary>
/// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true;
base.HandleUnauthorizedRequest(filterContext);
}
}
2) अपने Global.asax.cs में जोड़ें:
protected void Application_EndRequest(Object sender, EventArgs e)
{
if (Context.Items["AjaxPermissionDenied"] is bool)
{
Context.Response.StatusCode = 401;
Context.Response.End();
}
}
3) अपने jQuery AJAX सेटअप करने के लिए एक statusCode हैंडलर जोड़ें:
$.ajaxSetup({
statusCode: {
401: function() {
window.location.href = "path/to/login";
}
}
});
4) नियंत्रक या कार्रवाई जहां AuthorizeAttribute
AjaxAuthorizeAttribute
करने का उपयोग करने से इस व्यवहार चाहते बदलें:
[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
objEmpMain.FirstName = firstName;
objEmpMain.LastName = lastName;
objEmpMain.Initial = Initial;
objEmpMain.Address1 = Address;
...
...
...
}
असल में मेरा वर्तमान वर्ग "पब्लिक क्लास कर्मचारी नियंत्रक: नियंत्रक" जैसा दिखता है। क्या आप मुझे "पब्लिक क्लास अजाक्सअधिकृत एट्रिब्यूट: AuthorizeAttribute" जैसे परिवर्तन करने के लिए निर्देशित करते हैं ???? –
बस अपने नियंत्रकों या नियंत्रक कार्यों पर सजाए गए 'AjaxAuthorizeAttribute' के लिए' AuthorizeAttribute' को स्वैप करें। # 4 देखें जो मैंने अभी जोड़ा है। – HackedByChinese
क्षमा करें, क्या आप मुझे समझा सकते हैं कि मुझे "पब्लिक क्लास अजाक्सअधिकृत एट्रिब्यूट: AuthorizeAttribute" क्लास बनाने की आवश्यकता है ??? –