2012-09-17 20 views
5

मैं अपने एमवीसी अनुप्रयोग के लिए एक नई अनुमति आधारित पहुंच दृष्टिकोण को लागू करने की कोशिश कर रहा हूं; हमारे पास कई अनुमति समूह और प्रत्येक समूह में की अनुमति है। उदाहरण के लिए हमारे पास Invoices अनुमति समूह है जिसमें CreateInvoice,RemoveInvoice,etc अनुमति कुंजी शामिल हैं।सी # विशेषताएं: इनपुट पैरामीटर के रूप में enum स्थिरांक का उपयोग

इस दृष्टिकोण में प्रत्येक एमवीसी Action निष्पादन के लिए एक विशिष्ट अनुमति की आवश्यकता होनी चाहिए। मैं कुछ इस तरह CustomAttributes के माध्यम से ऐसा करने के लिए, कोशिश कर रहा हूँ:

public class InvoiceController : Controller 
    { 
     [RequirePermission(Permissions.Invoices.CreateInvoice)] 
     public ActionResult Create() 
     { 
      return View(); 
     } 
    } 

यह आसान डेवलपर्स अलग अनुमति समूह और अनुमति कुंजी याद करने के लिए मैं अनुमतियों की एक पूर्व निर्धारित सूची बनाने के लिए कोशिश कर रहा हूँ के लिए बनाने के लिए है कि ऐसा करना चाहिए अनुमति समूह और अनुमति कुंजी का संयोजन बनें। लेकिन सी # में विशेषताओं के तर्कों का उपयोग करने के लिए लागू प्रतिबंधों के कारण मैं इसे अभी तक काम नहीं कर सका।

मेरा आखिरी कोशिश प्रत्येक अनुमति समूह के लिए एक प्रगणक बनाने गया था और फिर वहाँ में enum स्थिरांक के रूप में अनुमति कुंजी को परिभाषित (मैं एक अतिरिक्त बड़ी enumurator बनाने के लिए और वहाँ के सारे अनुमति चाबियाँ डाल नहीं करना चाहती):

public class PermissionEnums 
{ 
    [PermissionGroup(PermissionGroupCode.Invoice)] 
    public enum Invoices 
    { 
     CreateInvoice = 1, 
     UpdateInvoice = 2, 
     RemoveInvoice = 3, 
     ManageAttachments = 4 
    } 

    [PermissionGroup(PermissionGroupCode.UserAccounts)] 
    public enum UserAccounts 
    { 
     Create = 1, 
     ChangePassword = 2 
    } 
} 

जैसा कि आप देख सकते हैं कि हमारे पास कोड का संयोजन है, PermissionGroup विशेषता और अनुमति कुंजी कोड प्रत्येक एनम निरंतर पर अंक कोड के रूप में निर्दिष्ट अनुमति समूह कुंजी निर्दिष्ट है।

RequirePermission विशेषता नीचे के रूप में परिभाषित:

public class RequirePermissionAttribute : Attribute 
{ 
    private Enum _Permission; 

    public RequirePermissionAttribute(Enum Permission) 
     : base() 
    { 
     _Permission = Permission; 
    } 
} 

लेकिन समस्या यह है कि प्रकार Enum की वस्तुओं गुण तर्क के रूप में इस्तेमाल नहीं किया जा सका है।/खेद:

कोई भी सुझाव/विचार

उत्तर

6

मुझे समाधान मिला है, केवल एक चीज बदलने की जरूरत है संरचना संरचना पैरामीटर का प्रकार है। बजाय Enum का उपयोग कर के आप object उपयोग करने के लिए:

public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _Permission; 

    public RequirePermissionAttribute(object Permission) 
     : base() 
    { 
     _Permission = Permission; 
    } 
} 

यहाँ पूरा कोड है:

/***************** Permission Groups And Keys *****************/ 
public static class Permissions 
{ 
    [PermissionGroup(PermissionGroupCode.Invoice)] 
    public enum Invoices 
    { 
     CreateInvoice = 1, 
     UpdateInvoice = 2, 
     RemoveInvoice = 3, 
     ManageAttachments = 4 
    } 

    [PermissionGroup(PermissionGroupCode.UserAccounts)] 
    public enum UserAccounts 
    { 
     Create = 1, 
     ChangePassword = 2 
    } 
} 

public enum PermissionGroupCode 
{ 
    Invoice = 1, 
    UserAccounts = 2, 
    Members = 3 
} 

/***************** Attributes & ActionFilters *****************/ 

[AttributeUsage(AttributeTargets.Enum)] 
public class PermissionGroupAttribute : Attribute 
{ 
    private PermissionGroupCode _GroupCode; 
    public PermissionGroupCode GroupCode 
    { 
     get 
     { 
      return _GroupCode; 
     } 
    } 

    public PermissionGroupAttribute(PermissionGroupCode GroupCode) 
    { 
     _GroupCode = GroupCode; 
    } 
} 


public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _RequiredPermission; 

    public RequirePermissionAttribute(object RequiredPermission) 
     : base() 
    { 
     _RequiredPermission = RequiredPermission; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var permissionGroupMetadata = (PermissionGroupAttribute)_RequiredPermission.GetType().GetCustomAttributes(typeof(PermissionGroupAttribute), false)[0]; 

     var groupCode = permissionGroupMetadata.GroupCode; 
     var permissionCode = Convert.ToInt32(_RequiredPermission); 

     return HasPermission(currentUserId, groupCode, permissionCode); 
    } 
} 
0

मुझे नहीं लगता कि thats संभव मैं अपनी बात करने की कोशिश की और विफल सराहना की है।

अनुमतियां कार्यों पर अधिकृत साथ किया जाना चाहिए और आप इस तरह अपने खुद के ovveride कुछ लिखने पर विचार कर सकते हैं:

[AttributeUsage(AttributeTargets.All)] 
    public sealed class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     //Its a piece of code from my app you can modify it to suit your needs or use the base one 
     if (!new CustomIdentity(httpContext.User.Identity.Name).IsAuthenticated) 
     { 
      return false; 
     } 

     return true; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     base.HandleUnauthorizedRequest(filterContext); 

    } 

} 
तो अपनी कार्रवाई पर

:

[CustomAuthorizeAttribute(Roles = "FE")] 
public ActionResult Index() 
{ 
    return RedirectToAction("Index", "Documents"); 
} 

लेकिन इसकी अभी भी एक स्ट्रिंग है कि आप उपयोग करें और इसके लिए काम करने के लिए आपको इसे कस्टम रोल प्रदाता के साथ संयोजित करने की आवश्यकता है। बहुत अधिक परेशानी लेकिन मेरी राय में इसके लायक है।

+0

हां, मुझे लगता है कि किया है लेकिन मेरी समस्या एक विशेषता (ActionFilter विशेषता) बनाने की जांच नहीं कर रहा है उपयोगकर्ता अनुमतियां पूर्वनिर्धारित अनुमति स्थिरांक बनाने के लिए मुझे बस एक बेहतर तरीका (सादा स्ट्रिंग कुंजियों का उपयोग करने की आवश्यकता है) की आवश्यकता है। – sos00

+1

http: //www.vivienchevallier।com/articles/create-a-custom-authorizeattribute-that-accepts-parameters-of-type-enum इसे आज़माएं। – AdrianCogiel