2012-11-07 5 views
97

मुझे उपयोगकर्ताओं के विशेषाधिकार स्तरों के आधार पर विचारों तक पहुंच को नियंत्रित करने की आवश्यकता है (मेरे पास कोई भूमिका नहीं है, उपयोगकर्ताओं को असाइन किए गए सीआरयूडी ऑपरेशन स्तरों के लिए केवल विशेषाधिकार स्तर) एमवीसी 4 आवेदन।एएसपी.नेट एमवीसी 4 अनुमति कोड के साथ कस्टम प्राधिकरण विशेषता (भूमिकाओं के बिना)

नीचे दिए गए उदाहरण AuthorizeUser मेरी कस्टम विशेषता होगी abd मुझे इसे नीचे की तरह उपयोग करने की आवश्यकता है।

[AuthorizeUser(AccessLevels="Read Invoice, Update Invoice")] 
public ActionResult UpdateInvoice(int invoiceId) 
{ 
    // some code... 
    return View(); 
} 


[AuthorizeUser(AccessLevels="Create Invoice")] 
public ActionResult CreateNewInvoice() 
{ 
    // some code... 
    return View(); 
} 


[AuthorizeUser(AccessLevels="Delete Invoice")] 
public ActionResult DeleteInvoice(int invoiceId) 
{ 
    // some code... 
    return View(); 
} 

क्या यह संभव है? कैसे? अग्रिम धन्यवाद ...

Chatura

उत्तर

197

मैं इस प्रकार एक कस्टम विशेषता के साथ ऐसा कर सकता है।

[AuthorizeUser(AccessLevel = "Create")] 
public ActionResult CreateNewInvoice() 
{ 
    //... 
    return View(); 
} 

कस्टम विशेषता वर्ग निम्नानुसार है।

public class AuthorizeUserAttribute : AuthorizeAttribute 
{ 
    // Custom property 
    public string AccessLevel { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     {     
      return false; 
     } 

     string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB 

     return privilegeLevels.Contains(this.AccessLevel);   
    } 
} 

आप HandleUnauthorizedRequest विधि अधिभावी द्वारा अपने कस्टम AuthorisationAttribute में एक अनाधिकृत उपयोगकर्ता अनुप्रेषित कर सकते हैं:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary(
        new 
         { 
          controller = "Error", 
          action = "Unauthorised" 
         }) 
       ); 
} 
+0

मैं HandleUnauthorizedRequest के अपने उदाहरण की कोशिश की है लेकिन जब मैं RouteValueDictionary निर्दिष्ट करते हैं, यह सिर्फ पर रीडायरेक्ट: मुख्य अंतर यह है जब उपयोगकर्ता प्रमाणीकृत नहीं है, यह मूल "HandleUnauthorizedRequest" विधि का उपयोग करता प्रवेश पृष्ठ पर रीडायरेक्ट करना होता है मुझे एक रास्ता है जो अस्तित्व में नहीं है। यह उस मार्ग को जोड़ता है जिसे मैं उपयोगकर्ता को उस मार्ग तक रीडायरेक्ट करना चाहता हूं जिस पर उपयोगकर्ता पहुंचना चाहता था ... si मुझे कुछ मिलता है: लोकलहोस्ट: 99 99/व्यवस्थापक/होम जब मैं चाहता था लोकलहोस्ट: 99 99/होम – Marin

+1

@Marin क्षेत्र = स्ट्रिंग जोड़ने का प्रयास करें। RouteVueueDictionary – Alex

+25

में लक्षण मैं ऊपर उठ रहा था लेकिन फिर मैंने देखा कि "अगर (हालत) {वापसी सच है;} और {{वापसी झूठी;}" अंत में .... – GabrielBB

1

यहाँ पिछला के लिए एक संशोधन है। जवाब।

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated) { 

      filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary(
          new 
          { 
           controller = "Account", 
           action = "Unauthorised" 
          }) 
         ); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
संबंधित मुद्दे