2014-11-20 6 views
7

मैं .NET, MVC & पहचान फ्रेमवर्क के लिए नया हूं। मैंने देखा कि पहचान ढांचा एनोटेशन के माध्यम से व्यक्तिगत नियंत्रक कार्यों को सुरक्षित करने की अनुमति देता है।अनुमति आधारित प्राधिकरण .net पहचान

[Authorize] 
public ActionResult Edit(int? Id){ 
    //edit action 
} 

मैं उपयोगकर्ता अनुमतियों के आधार पर कुछ क्रियाएं सुरक्षित करना चाहता हूं।

उदाहरण: एक ब्लॉग एप्लिकेशन जहां केवल उपयोगकर्ता पोस्ट करने वाले उपयोगकर्ता को संपादित कर सकते हैं।

इस बात को ध्यान में रखते हुए, क्या नीचे दिए गए विकल्प को निष्पादित करना संभव है? यदि हां, तो क्या सर्वोत्तम तरीके से प्राप्त करने के तरीके पर संसाधन और उदाहरण हैं?

[Authorize(Entity = "Entry", Permission = "Edit", Id = Id)] 
public ActionResult Edit(int? Id){ 
    //edit action 
} 

या

[BlogEntryPermission(Permission = "Edit", Id = Id)] 
public ActionResult Edit(int? Id){ 
    //edit action 
} 

कहाँ ब्लॉग Id अनुरोध से कब्जा कर लिया है।

अनुमति आधारित प्रमाणीकरण पर कोई भी जानकारी या दिशा सबसे सराहना की जाएगी। आपकी सहायता के लिये पहले से ही धन्यवाद।

भूमिकाओं
[AuthorizeEntryPermission(Permission = "Edit")] 
public ActionResult Edit(int? Id){ 
    //edit action 
} 

उत्तर

6

आप जहाँ आप अपने पैरामीटर निर्दिष्ट करते हैं और फिर अनुरोध

public class AuthorizeEntryPermission : AuthorizeAttribute 
{ 
     public string Permission { get; set; } 

     public AuthorizeEntryPermission(){ 
     } 

     public AuthorizeEntryPermission(string Permission) 
     { 
      this.Permission = Permission; 
     } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      var id = context.Request.RequestContext.RouteData.Values["Id"]; 
      //check your permissions 
     } 

     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (AuthorizeCore(filterContext.HttpContext)) 
      { 
       // ** IMPORTANT ** 
       // Since we're performing authorization at the action level, the authorization code runs 
       // after the output caching module. In the worst case this could allow an authorized user 
       // to cause the page to be cached, then an unauthorized user would later be served the 
       // cached page. We work around this by telling proxies not to cache the sensitive page, 
       // then we hook our custom authorization code into the caching mechanism so that we have 
       // the final say on whether a page should be served from the cache. 

       HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache; 
       cachePolicy.SetProxyMaxAge(new TimeSpan(0)); 
       cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */); 
      } 
      else 
      { 
       //handle no permission 
      } 
     } 

     private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) 
     { 
      validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); 
     } 
    } 

से एक blogId प्राप्त कर सकते हैं इस तरह इसका उपयोग अपने कस्टम AuthorizationAttribute लागू कर सकते हैं। आप भूमिकाओं को दानेदार के रूप में बना सकते हैं जैसा कि आपको चाहिए - अनिवार्य रूप से उन्हें अनुमतियों की तरह बनाना। उदाहरण के लिए, आप की तरह भूमिका नाम कर सकता है:

  • EditBlogPost
  • AddBlogPost
  • ViewBlogPost

तो फिर तुम भूमिकाओं अपने नियंत्रक पर AuthorizeAttribute में निर्मित का उपयोग कर सेट कर सकते हैं।

[Authorize(Roles = "AddBlogPost")] 
public ActionResult Add(){ 
    //add action 
} 

[Authorize(Roles = "AddBlogPost")] 
[HttpPost] 
public ActionResult Add(BlogModel model){ 
    //add action 
} 

[Authorize(Roles = "EditBlogPost")] 
public ActionResult Edit(int? Id){ 
    //edit action 
} 

[Authorize(Roles = "EditBlogPost")] 
[HttpPost] 
public ActionResult Edit(BlogModel model){ 
    //edit action 
} 

[Authorize(Roles = "ViewBlogPost")] 
public ActionResult View(){ 
    //view action 
} 

फिर यह आपके डेटाबेस में प्रत्येक उपयोगकर्ता को अलग-अलग भूमिका निभाने का मामला है।

+0

के लिए धन्यवाद दिशा।पथ चर का उपयोग करने का प्रयास करते समय अब ​​एक समस्या में चल रहा है। var id = httpContext.Request.Form ["BlogId"]; इस तरह परिभाषित पथ पैरा के लिए काम नहीं करेगा:/BlogPost/संपादित करें/1। क्या इस चर को एक्सेस करने का कोई साफ तरीका है? context.Request.RequestContext.RouteData.Values.ElementAt (2)। वैल्यू काम करता है लेकिन यकीन नहीं है कि मैं कुछ भरोसा करना चाहता हूं। – mcroteau

+1

@croteau आप 'context.Request.RequestContext.RouteData.Values ​​[" Id "]' –

1

MVC है बिल्ट-इन:

+2

का उपयोग कर सकते हैं, हालांकि आपको इस दृष्टिकोण से सावधान रहना होगा। कुकी सीमा के लिए अधिकतम आकार है। एक बड़े आवेदन में आपके पास हजारों ग्रैनुलर भूमिकाएं हो सकती हैं – Shoe

+0

अच्छी बात। हालांकि, ओपी ने कहा कि वह एक ब्लॉग के लिए अनुमति चाहता था - जिसका अर्थ यह है कि प्रबंधन के लिए कई नियंत्रक नहीं हैं। लेकिन अगर बड़ी संख्या में अनुमतियां हैं तो मैं सहमत हूं कि AuthorizeAttribute को अनुकूलित करना बेहतर तरीका होगा। – NightOwl888

+0

@Shoe - असल में, आपको कुकी के अंदर भूमिकाओं को स्टोर करने की ज़रूरत नहीं है। आप इसे प्रति अनुरोध लोड करने या प्रति उपयोगकर्ता उन्हें कैश करने के लिए बस सेट अप कर सकते हैं। या, आप भूमिकाओं को बिटवाई आईडी के साथ सेट कर सकते हैं, इसलिए कुकी में स्टोर करने की आवश्यकता केवल एक चीज है जो एक लंबी संख्या है। – NightOwl888

1

मुझे आशा है कि आपकी समस्या अभी तक हल हो जाएगी। लेकिन एक नया समाधान जोड़ने के लायक है। मैंने माइक्रोसॉफ्ट आइडेंटिटी 2 सदस्यता प्रणाली के लिए अनुमति-आधारित एक्सटेंशन लागू किया है। यह एक ओपन सोर्स प्रोजेक्ट है और आप भंडार यहाँ करने के लिए उपयोग कर सकते हैं:

https://github.com/Arminkhodaei/Identity-Permission-Extension

उपयोग:

पहले दृष्टिकोण:

// GET: /Manage/Index 
[AuthorizePermission(Name = "Show_Management", Description = "Show the Management Page.")] 
public async Task<ActionResult> Index(ManageMessageId? message) 
{ 
    //... 
} 

दूसरा दृष्टिकोण:

// GET: /Manage/Users 
public async Task<ActionResult> Users() 
{ 
    if (await HttpContext.AuthorizePermission(name: "AllUsers_Management", description: "Edit all of the users information.")) 
    { 
     return View(db.GetAllUsers()); 
    } 
    else if (await HttpContext.AuthorizePermission(name: "UnConfirmedUsers_Management", description: "Edit unconfirmed users information.")) 
    { 
     return View(db.GetUnConfirmedUsers()); 
    } 
    else 
    { 
     return View(new List<User>()); 
    } 
} 
+0

हाय आर्मीन, क्या मैं नियंत्रक स्तर पर इस प्राधिकरणप्रमिशन विशेषता का उपयोग कर सकता हूं? – Alienalone

+0

हाय, @ एलियनोनोन, निश्चित रूप से आप कर सकते हैं। अधिक निर्देश और स्पष्टीकरण प्राप्त करने के लिए, आप दस्तावेज़ के ** उपयोग ** अनुभाग की समीक्षा कर सकते हैं। –

+0

धन्यवाद। मैंने कोशिश की और यह मेरे लिए सही काम कर रहा है। फिर से धन्यवाद – Alienalone

संबंधित मुद्दे