2009-09-14 10 views
10

मैं एक अधिकृत साथ एक नियंत्रक है इस तरह का श्रेय:मैं एक Http 401 परिणाम के लिए एक कस्टम त्रुटि पृष्ठ कैसे प्रदर्शित करूं?

[Authorize(Roles = "Viewer")] 
public class HomeController : Controller 
{ 
    //... 
} 

और मेरे web.config customErrors तरह की स्थापना की है निम्नलिखित:

<customErrors mode="On"> 
     <error statusCode="401" redirect="notauthorized.html"/> 
    </customErrors> 

जब मैं घर नियंत्रक पर एक कार्रवाई को लागू करने की कोशिश एक गैर-अधिकृत भूमिका का उपयोग करके मुझे बस एक खाली पृष्ठ मिलता है। मुझे कस्टम पेज पर रीडायरेक्ट नहीं किया जाता है। कोई विचार?

उत्तर

0

एक मानक दृष्टिकोण के रूप में तक मुझे पता है एक सरल त्रुटि नियंत्रक कि आने वाले अनुरोधों को हैंडल करने के लिए है और निर्भर करता है जो httpstatus कोड पर वापस आ गया था उचित दृश्य आउटपुट ... कुछ इस तरह:

public class ErrorController : Controller 
{ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Index() 
    { 

     //Check if the statuscode is HttpStatusCode.NotFound; 
     if(Response.StatusCode == 401) 
      return View("NotAuthorised"); 
     return View(); 
    } 
} 

और फिर अपने webconfig में कोई रीडायरेक्ट कार्रवाई निर्दिष्ट करें:

<customErrors mode="On" defaultRedirect="~/Error" /> 
3

tvanfosson के Answerthis very similar question से पर एक नजर डालें, यह मैं क्या कर रहा हूँ (धन्यवाद tvanfosson करने के लिए) है, इसलिए अब मैं सिर्फ इतना कहना है:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")] 
public class SuperAdminController : Controller 
... 

यदि उपयोगकर्ता भूमिका में नहीं है, तो वे व्यूनाम द्वारा निर्दिष्ट दृश्य देखेंगे।

नोट: रिक्त पृष्ठ कैसिनी से आ रही है, तो आप एक वास्तविक आईआईएस सर्वर से एप्लिकेशन को ले अगर आप 401

+0

की तरह अपनी कार्रवाई नियंत्रक में अपने "झंडा" जोड़ने तुम्हारा मतलब अगर मैं आईआईएस के लिए एप्लिकेशन को ले मैं देखना चाहिए कस्टम पेज? या मुझे मानक आईआईएस 401 पेज देखना चाहिए? –

+0

आप 401 देखेंगे। –

9

मुझे खुशी इस सवाल का एक छोटा सा पुराना है देखेंगे, लेकिन यह किसी को मदद मिल सकती है ।

एक 401 के लिए आप शायद मानक 401 अनधिकृत पृष्ठ देख रहे होंगे, भले ही आपने अपने web.config में कस्टमर अनुभाग में 401 जोड़ा हो। मैंने पढ़ा है कि आईआईएस और विंडोज प्रमाणीकरण का उपयोग करते समय चेक एएसपी.NET से पहले होता है, अनुरोध भी देखता है, इसलिए आप कैसिनी पर रिक्त पृष्ठ देखते हैं और आईआईएस पर यह 401 है।

मेरी प्रोजेक्ट के लिए मैंने ग्लोबल.एक्सएक्स फ़ाइल संपादित की 401 त्रुटियों के लिए बनाए गए मार्ग पर रीडायरेक्ट करने के लिए, उपयोगकर्ता को "इसे देखने के लिए अनधिकृत" दृश्य में भेजना।

Global.asax में:

void Application_EndRequest(object sender, System.EventArgs e) 
    { 
     // If the user is not authorised to see this page or access this function, send them to the error page. 
     if (Response.StatusCode == 401) 
     { 
      Response.ClearContent(); 
      Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults); 
     } 
    } 

और Route.config में:

 routes.MapRoute(
     "ErrorHandler", 
     "Error/{action}/{errMsg}", 
     new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional } 
     ); 

और नियंत्रक में:

public ViewResult Unauthorised() 
    { 
     //Response.StatusCode = 401; // Do not set this or else you get a redirect loop 
     return View(); 
    } 
0

इसके अलावा आप अपने खुद के बना सकते हैं कस्टम प्रमाणीकरण विशेषता और y पर उपयोगकर्ताओं को रीडायरेक्ट करने के लिए अपना स्वयं का मार्ग सेट करें हमारा पेज

यहाँ

अपने प्रोजेक्ट पर एक नमूना:

/*../controllers/CustomAuthorizationAttribute.cs */ 
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext) 
    { 
     string session = filterContext.HttpContext.Session["id"] != null ? filterContext.HttpContext.Session["id"].ToString() : null; 
     if (string.IsNullOrEmpty(session)) 
     { 
      // Unauthorized! 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "action", "Create" }, { "controller", "Sessions" } 
        //,{ "parameterName", "YourParameterValue" } 
       } 
      ); 
     } 
    } 
} 

और आप इस

/*../controllers/ReportsController.cs */ 
public class ReportsController : Controller 
{ 
    [CustomAuthorizationAttribute] 
    public ActionResult Index() 
    { 
     //do something 
    } 
} 
संबंधित मुद्दे