कैसे, 401 (अनधिकृत) को संभालने के लिए 403 (निषिद्ध) और 500 (आंतरिक सर्वर त्रुटि) MVC में। AJAX/गैर-AJAX कॉल के लिए और एएसपीएक्स प्रपत्र प्रमाणीकरण के तहत।
इसे अलग-अलग अपवादों को अलग-अलग संभालने के लिए बदला जा सकता है और अलग-अलग प्रतिक्रिया दे सकती है कि अनुरोध अजाक्स है या नहीं। लेख भाग इसे किसी भी नियमित एमवीसी वेब फॉर्म को रीडायरेक्ट-टू-लॉगिन-पेज को बाईपास करने की अनुमति देता है और इसके बजाय 401 अनधिकृत लौटाता है - फिर आपके क्लाइंट-साइड जेएस फ्रेमवर्क http स्थिति 401/403 पर अधिक आसानी से प्रतिक्रिया दे सकता है।
// FilterConfig.cs:
filters.Add(new ApplicationAuthorizeAttribute());
filters.Add(new ApplicationHandleErrorAttribute());
public class ApplicationAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
// Note: To reach here, a Web.config path-specific rule 'allow users="?"' is needed (otherwise it redirects to login)
var httpContext = filterContext.HttpContext;
var request = httpContext.Request;
var response = httpContext.Response;
if (request.IsAjaxRequest())
{
response.SuppressFormsAuthenticationRedirect = true;
response.TrySkipIisCustomErrors = true;
}
filterContext.Result = new HttpUnauthorizedResult();
}
}
public class ApplicationHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
var exception = context.Exception is AggregateException
? ((AggregateException)context.Exception).InnerExceptions.First()
: context.Exception;
var request = context.HttpContext.Request;
var response = context.HttpContext.Response;
var isAjax = request.IsAjaxRequest();
if (exception is MyCustomPermissionDeniedException)
{
filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden);
response.TrySkipIisCustomErrors = isAjax;
filterContext.ExceptionHandled = true;
return;
}
#if DEBUG
if (!isAjax)
{
// Show default aspx yellow error page for developers
return;
}
#endif
var requestUri = request.Url == null ? "" : request.Url.AbsoluteUri;
MyCustomerLogger.Log(exception, requestUri);
response.Clear();
response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
#if DEBUG
var errorMessage = exception.Message;
#else
var errorMessage = "An error occurred, please try again or contact the administrator.";
#endif
response.Write(isAjax
? JsonConvert.SerializeObject(new {Message = errorMessage})
: errorMessage);
response.End();
response.TrySkipIisCustomErrors = true;
context.ExceptionHandled = true;
}
}
Web.config:
<system.webServer>
<authentication mode="Forms">
<forms name=".MYAUTHCOOKIE" protection="All" loginUrl="/Account/Login" timeout="18000" slidingExpiration="true" enableCrossAppRedirects="false" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.webServer>
<!-- ajax api security done via ApplicationAuthorizeAttribute -->
<location path="api">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
वेब सेवा API अनुरोधों के लिए अतिरिक्त मार्ग: jQuery त्रुटि को संभालने के लिए के लिए (नियमित MVC मार्ग ऊपर डाल)
// This route has special ajax authentication handling (no redirect to login page)
routes.MapRoute(
name: "DefaultApi",
url: "api/{controller}/{action}/{id}",
defaults: new { id = UrlParameter.Optional }
);
नमूना क्लाइंट पक्ष कोड :
$.ajaxSetup({
complete: function onRequestCompleted(xhr, textStatus) {
if (xhr.readyState == 4 && xhr.status == 401) {
// Not needed with smart status: && xhr.responseText.substring(0, 150).indexOf("<title>Log in") != -1
//location.href = "/Account/Login";
alert("Your session has timed out.");
}
}
});
वैकल्पिक रूप से, आप सभी लेखों को ApplicationHandleErrorAttribute के माध्यम से जा सकते हैं, और उस web.config से छुटकारा पाने के लिए उपयोगकर्ताओं = "?" से इनकार कर सकते हैं। लेकिन मेरे पास एक विरासत एएसपीएक्स पृष्ठ है जो एमवीसी फ़िल्टरिंग को हिट नहीं करता है, इसलिए मैं चाहता हूं कि उपयोगकर्ता = "?" से इनकार करें।
स्रोत
2015-05-27 17:24:03
असल में मैं वही कर रहा हूं, साझा नियंत्रक और अनधिकृत कार्रवाई है, लेकिन फिर भी मुझे एक ही डिफ़ॉल्ट http 403 पृष्ठ त्रुटि मिल रही है, न कि मेरे परिभाषित पृष्ठ –
बहुत उपयोगी लिंक http://stackoverflow.com/questions/2504923/how -to-redirect-authorize-to-loginurl-only-when-roles-are-used- –
@SaboorAwan। मैंने भाग्य के साथ ऐसा करने की कोशिश की। नियंत्रक विधि कभी नहीं कहा जाता है। क्या आप इस उत्तर के साथ या आपके द्वारा पोस्ट किए गए लिंक के साथ समस्या का समाधान करते हैं? – Marco