2015-11-13 12 views
6

में एक आवश्यकता/नीति में डीआई मैं एएसपी.NET 5 में एक कस्टम प्राधिकरण फ़िल्टर प्रोग्राम करने का एक तरीका ढूंढ रहा हूं क्योंकि वर्तमान कार्यान्वयन नीतियों/आवश्यकताओं में निर्भर करता है जो बदले में उपयोग में पूरी तरह निर्भर करता है दावाों के अनुसार, इस तरह की पंद्रहवीं और कभी-कभी बदलती पहचान प्रणाली पर मैं वास्तव में थक गया हूं (मैंने अपने सभी स्वादों का प्रयास किया है)।एएसपी.नेट एमवीसी 6

मेरे पास परमिट (200 से अधिक) का एक बड़ा सेट है, जिसमें मैं दावा के रूप में कोड नहीं करना चाहता क्योंकि मेरे पास उनके लिए अपना खुद का भंडार है और सैकड़ों तारों की तुलना करने के बजाय इसके खिलाफ जांच करने का बहुत तेज़ तरीका है (अंत में क्या दावे हैं)।

मैं प्रत्येक विशेषता है कि अनुमति के अपने कस्टम भंडार के खिलाफ जाँच की जानी चाहिए में एक पैरामीटर पारित करने के लिए की जरूरत है:

[Authorize(Requires = enumPermission.DeleteCustomer)] 

मैं जानता हूँ कि यह सबसे अक्सर परिदृश्य नहीं है, लेकिन मुझे लगता है कि यह एक बढ़त नहीं है मामला। मैंने @Lastprivilege द्वारा उनके शानदार पोस्ट "एएसपी.नेट 5 और एमवीसी 6: प्राधिकरण" में सुरक्षा राज्य पर वर्णित तरीके से इसे लागू करने की कोशिश की है, लेकिन मैंने लेखक के रूप में उसी दीवार को मारा है, जिसने भी खोला है एएसपी.नेट 5 गीथब रेपो पर एक मुद्दा, जिसे बहुत अधिक स्पष्टीकरण तरीके से बंद कर दिया गया है: link

इस बारे में कोई विचार कैसे प्राप्त किया जाए? शायद अन्य प्रकार के फ़िल्टर का उपयोग कर? उस मामले में, कैसे?

मान लेते हैं आप एक सेवा IPermissionStore जो पुष्टि करता है उसे किसी उपयोगकर्ता विशेषता पर निर्दिष्ट आवश्यक अनुमतियों अगर कहा जाता है दो:

+0

जहां वास्तव में समस्या है? वह निर्भरता हल नहीं होती है या पैरामीटर सेट नहीं होता है? –

+0

समस्या यह है कि मैं यह नहीं समझ सकता कि तर्कों को ऑब्जेक्ट्स के सरणी के रूप में कैसे पास किया जाए और फिर उन्हें फ़िल्टर के अंदर प्राप्त करें ... पिछले संस्करणों में यह फ़िल्टर पर एक ही संपत्ति के साथ सार्वजनिक संपत्ति बनाकर किया गया था पैरामीटर के रूप में आप पास कर रहे थे (ऊपर वर्णित अनुसार) लेकिन अब मुझे ऑब्जेक्ट सरणी पास करनी है ... – Vi100

+0

यह नया प्राधिकरण फ़िल्टर के साथ समस्या है, हालांकि प्रश्नों का इरादा नीतियों के साथ इसे प्राप्त करने के लिए किसी भी कार्यान्वयन के लिए पूछना था/आवश्यकताएं – Vi100

उत्तर

1

के बाद आप इस परिदृश्य कैसे प्राप्त कर सकते हैं का एक उदाहरण है।

public class MyCustomAuthorizationFilterAttribute : Attribute, IFilterFactory, IOrderedFilter 
{ 
    private readonly Permision[] _permissions; 

    public MyCustomAuthorizationFilterAttribute(params Permision[] permissions) 
    { 
     _permissions = permissions; 
    } 

    public int Order { get; set; } 

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) 
    { 
     var store = serviceProvider.GetRequiredService<IPermissionStore>(); 

     return new MyCustomAuthorizationFilter(store, _permissions) 
     { 
      Order = Order 
     }; 
    } 
} 

public class MyCustomAuthorizationFilter : IAuthorizationFilter, IOrderedFilter 
{ 
    private readonly IPermissionStore _store; 
    private readonly Permision[] _permissions; 

    public int Order { get; set; } 

    public MyCustomAuthorizationFilter(IPermissionStore store, params Permision[] permissions) 
    { 
     _store = store; 
     _permissions = permissions; 
    } 

    public void OnAuthorization(AuthorizationContext context) 
    { 
     // Check if the action has an AllowAnonymous filter 
     if (!HasAllowAnonymous(context)) 
     { 
      var user = context.HttpContext.User; 
      var userIsAnonymous = 
       user == null || 
       user.Identity == null || 
       !user.Identity.IsAuthenticated; 

      if (userIsAnonymous) 
      { 
       Fail(context); 
      } 
      else 
      { 
       // check the store for permissions for the current user 
      } 
     } 
    } 

    private bool HasAllowAnonymous(AuthorizationContext context) 
    { 
     return context.Filters.Any(item => item is Microsoft.AspNet.Authorization.IAllowAnonymous); 
    } 

    private void Fail(AuthorizationContext context) 
    { 
     context.Result = new HttpUnauthorizedResult(); 
    } 
} 

// Your action 
[HttpGet] 
[MyCustomAuthorizationFilter(Permision.CreateCustomer)] 
public IEnumerable<string> Get() 
{ 
    //blah 
} 
+0

यदि यह सही एएसपी.NET 5 फैशन में है तो मुझे बहुत स्पष्ट नहीं है लेकिन यह वास्तव में काम करता है ... मैं यह जवाब स्वीकार करता हूं, हालांकि, क्या आप मुझे बता सकते हैं कि आपका उदाहरण पुरानी कार्यक्षमता में निर्भर है जिसे बहिष्कृत किया जा सकता है संक्षेप में? – Vi100

+0

आप 'IFilterFactory' से संबंधित नमूनों के लिए जिथब रेपो में एक नज़र डाल सकते हैं (उदाहरण के लिए: https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNet.Mvc.Core/FormatFilterAttribute.cs # एल 16) ... चूंकि एएसपी.नेट 5 अभी भी बीटा में है, मैं यह सुनिश्चित नहीं कर सकता कि चीजें –

+0

नहीं बदलेगी यदि आप 'IAuthorizationFilter' का उपयोग करते हैं, तो कृपया' IAsyncAuthorizationFilter' को भी लागू करें, मुझे इसके साथ समस्या थी –

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