2012-02-29 12 views
6

मेरे पास एक ऐसी क्रिया है जिसे मैं केवल "व्यवस्थापक" भूमिका तक सीमित करना चाहता हूं। मैन्युअल रूप से नियंत्रक/संपादित करें/1 पथ के अंतर्गत जा रहा मैं प्रवेश पृष्ठ पर पुनः निर्देशित कर रहा हूँ के बाद[प्राधिकरण] विफलता के बाद 404 त्रुटि पृष्ठ दिखाएं

[Authorize(Roles = "Admin")] 
public ActionResult Edit(int id) 

: मैं इस तरह किया था। खैर, यह शायद बुरा नहीं है, लेकिन मैं इसके बजाय 404 दिखाना चाहता हूं और इसके लिए विशेषताओं का उपयोग करके चिपकने की कोशिश करता हूं। क्या यह संभव है?

+3

बस एक टिप्पणी, शायद आप दिखाना चाहिए एक 401 या 403 http://en.wikipedia.org/ विकी/List_of_HTTP_status_codes # 4xx_Client_Error – Danny

+1

ओह, औपचारिक रूप से आप सही हैं, लेकिन मैं नहीं चाहता कि दूसरों को यह पता चले कि कार्रवाई का नाम सही है (जो शायद यह सुझाव देगा) – deha

+0

मेरा मानना ​​है कि यह एक डुप्लिकेट है [Asp.net एमवीसी प्राधिकृत विशेषता, कस्टम "कोई अधिकार नहीं" पृष्ठ पर रीडायरेक्ट करें] (http://stackoverflow.com/q/4457476/267448) –

उत्तर

14

क्या यह संभव है?

ज़रूर, आप एक कस्टम अधिकृत विशेषता लिख ​​सकते हैं:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "~/Views/Shared/401.cshtml" 
     }; 
    } 
} 

और उसके बाद का उपयोग यह:

[MyAuthorize(Roles = "Admin")] 
public ActionResult Edit(int id) 

टिप्पणी: आप शायद एक 401 या 403 पेज उपयोगकर्ता यदि दिखाना चाहते हैं 404 के बजाय अधिकृत नहीं है जो फ़ाइल के लिए नहीं है।

+0

दूसरों के लिए यह जानना उपयोगी हो सकता है कि इसे [डारिन के उत्तरों] के साथ जोड़ा जा सकता है (http://stackoverflow.com/questions/5314673/user-is-in-role-admin-but-authorizeroles-admin- अभ्यस्त प्रमाणित)। मैंने बस यही किया है और यह शानदार ढंग से काम करता है। दोनों को गठबंधन करने के लिए उसी उत्तर में 'उत्तर प्राधिकरण' विधि के रूप में उसी उत्तर में 'हैंडलुनेराइज्ड रिक्वेस्ट' विधि शामिल है, जो अन्य उत्तर से 'ऑन-प्राधिकरण' विधि के रूप में है। अच्छा काम डारिन रखो! – Ben

+0

@ बेन क्या आप अपना समाधान साझा कर सकते हैं? – Daniel

+0

@Daniel मैं कोशिश कर सकता हूँ! यह 2 साल हो गया है क्योंकि मैंने इस कोड को देखा लेकिन मैं एक मिनट में एक नया जवाब दूंगा। – Ben

1

मेरी टिप्पणी @ डैरिन के जवाब पर @ डैनियल टिप्पणी के जवाब में यह मेरा दिया गया है:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     string cookieName = FormsAuthentication.FormsCookieName; 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated || 
      filterContext.HttpContext.Request.Cookies == null || 
      filterContext.HttpContext.Request.Cookies[cookieName] == null 
     ) 
     { 
      HandleUnauthorizedRequest(filterContext); 
      return; 
     } 

     var authCookie = filterContext.HttpContext.Request.Cookies[cookieName]; 
     var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(','); 

     var userIdentity = new GenericIdentity(authTicket.Name); 
     var userPrincipal = new GenericPrincipal(userIdentity, roles); 

     filterContext.HttpContext.User = userPrincipal; 
     base.OnAuthorization(filterContext); 
    } 

    // Redirects unauthorized users to a "401 Unauthorized" page 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "~/Views/Shared/Error/401.cshtml" 
     }; 
    } 
}