2009-08-14 16 views
28

मैं एक कस्टम भूमिका प्रदाता बना रहा हूं का उपयोग कर एक पहुँच से मना कर पृष्ठ पर रीडायरेक्ट और मैं सेट एक अधिकृत मेरी नियंत्रक में एक भूमिका को निर्दिष्ट विशेषता है और यह इस तरह ठीक काम कर रहा है,:ASP.NET MVC कस्टम भूमिका प्रदाता

[Authorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 
... 

लेकिन जब किसी उपयोगकर्ता को इस नियंत्रक तक पहुंच नहीं है, तो उसे लॉगिन पृष्ठ पर रीडायरेक्ट किया जाता है। मैं उसे "AcessDenied.aspx" पृष्ठ पर रीडायरेक्ट कैसे कर सकता हूं?

उत्तर

42
[AccessDeniedAuthorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if(filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectResult("~/AcessDenied.aspx"); 
     } 
    } 
} 
+6

यदि उपयोगकर्ता लॉग इन है और पृष्ठ तक पहुंचने का प्रयास करता है, तो उसे AccessDenied पृष्ठ पर रीडायरेक्ट कर दिया जाएगा। अच्छा। लेकिन, यदि उपयोगकर्ता लॉग इन नहीं है, तो वे AccessDenied पृष्ठ पर रीडायरेक्ट हो जाएंगे। खराब।उस स्थिति में, उन्हें लॉगिन पेज पर रीडायरेक्ट किया जाना चाहिए। –

+3

यदि आप पृष्ठ को सामान्य रूप से उस स्थिति में रीडायरेक्ट करना चाहते हैं, जिसके बाद उपयोगकर्ता अब आधार पर नहीं है। ऑनऑधिकरण() विधि कॉल, शेष कोड के आस-पास एक कथन जोड़ें जो जांचता है कि थ्रेडिंग। थ्रेड.कुरेंट प्रिंसिपल। Identity.IsAuthenticated। इस प्रकार उपयोगकर्ता को AccessDenied पृष्ठ पर निर्देशित किया जाता है जब तक उपयोगकर्ता प्रमाणीकृत नहीं होता है ... इस स्थिति में यह डिफ़ॉल्ट कार्रवाई करेगा (लॉगिन पृष्ठ पर रीडायरेक्ट करें) – Frinavale

+0

इस वर्ग को कहां रखा जाता है? नियंत्रक में? – Jay

8

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

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

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

22

ई-जी-एन के उत्तर के आधार पर मेरा समाधान यहां है। मेरा उपयोगकर्ता लॉग इन पेज पर सही ढंग से रीडायरेक्ट करता है अगर वे लॉग इन नहीं हैं, लेकिन यदि वे लॉग इन हैं तो एक्सेस अस्वीकृत पृष्ठ पर हैं लेकिन उस पृष्ठ को देखने के लिए अनधिकृत हैं।

[AccessDeniedAuthorize(Roles="SuperAdmin")] 
public class SuperAdminController : Controller 

AccessDeniedAuthorizeAttribute.cs:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new RedirectResult("~/Account/Logon"); 
      return; 
     } 

     if (filterContext.Result is HttpUnauthorizedResult) 
     { 
      filterContext.Result = new RedirectResult("~/Account/Denied"); 
     } 
    } 
} 

AccountController.cs:

public ActionResult Denied() 
{ 
    return View(); 
} 

दृश्य/खाता/Denied.cshtml: (उस्तरा वाक्य रचना)

@{ 
    ViewBag.Title = "Access Denied"; 
} 

<h2>@ViewBag.Title</h2> 

Sorry, but you don't have access to that page. 
+1

स्वीकृत उत्तर से बिल्कुल सही संशोधन, धन्यवाद भाई –

6

एक मामूली मैट के जवाब में सुधार बी y हार्ड-कोड की जरूरत लॉग ऑन पेज से बचने और वैकल्पिक रूप से विशेषता के भीतर पहुँच से मना कर देखने की स्थापना:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedViewName { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (string.IsNullOrWhiteSpace(AccessDeniedViewName)) 
       AccessDeniedViewName = "~/Account/AccessDenied"; 

      filterContext.Result = new RedirectResult(AccessDeniedViewName); 
     } 
    } 
} 
0
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 

      if (filterContext.Result is HttpUnauthorizedResult && WebSecurity.IsAuthenticated) 
      { 
       filterContext.Result = new RedirectResult("~/Account/AccessDenied"); 
      } 
     } 
    } 
0

मैं विक जवाब को आधार बनाया है मेरे लिए एक अलग प्रवेश निषेध पेज के लिए अनुमति देने के लिए प्रत्येक आवेदन के क्षेत्रों में से प्रत्येक। विक Alcazar को

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedController { get; set; } 
    public string AccessDeniedAction { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction)) 
      { 
       AccessDeniedController = "Home"; 
       AccessDeniedAction = "AccessDenied"; 
      } 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction })); 
     } 
    } 
} 
0

बस एक छोटा सा अद्यतन, जोड़ा गया विवरण: आवेदन यह वर्तमान क्षेत्र के नियंत्रक और कार्रवाई करने के लिए पुनर्निर्देश के मार्ग पर एक RedirectToRouteResult लौटने के बजाय, के बजाय, जिसका URL रिश्तेदार के लिए पुनः निर्देशित द्वारा यह किया रीडायरेक्ट में अनुरोध यूआरएल की ताकि पहुँच से मना कर के विवरण और लॉग इन कर सकते हैं, जो अगर चाहते

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string AccessDeniedViewName { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated && 
      filterContext.Result is HttpUnauthorizedResult) 
     { 
      if (string.IsNullOrWhiteSpace(AccessDeniedViewName)) 
       AccessDeniedViewName = "~/Account/AccessDenied"; 

      var requestUrl = filterContext.HttpContext.Request.Url; 

      filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl)); 
     } 
    } 
} 
5

पुनर्निर्देशन हमेशा सबसे अच्छा समाधान

उपयोग स्टेन नहीं है द्वारा डार्ड http कोड 403:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
संबंधित मुद्दे