2017-01-07 16 views
5

में कस्टम प्राधिकरण विशेषता। मैं .NET कोर 1.1 में एक एपीआई बना रहा हूं। मैं आधार नियंत्रक में User ऑब्जेक्ट HttpContext.User से ऑब्जेक्ट बनाता हूं कि मेरे सभी अन्य नियंत्रकों का उत्तराधिकारी है, और मेरे पास डिफ़ॉल्ट रूप से प्रमाणीकरण सक्षम है (आवश्यक होने पर [AllowAnonymous] के साथ मैन्युअल रूप से अक्षम होना चाहिए)। User ऑब्जेक्ट में IsAdmin संपत्ति है। अभी मैं जांच कर रहा हूं कि उपयोगकर्ता नीचे दिए गए प्रत्येक प्रासंगिक फ़ंक्शन के शीर्ष पर एक व्यवस्थापक है, लेकिन मुझे लगता है कि इस कोड को सरल और साफ करने के लिए कस्टम विशेषता जोड़ने का एक तरीका होना चाहिए।.NET कोर

bool.Parse(HttpContext.User.FindFirst("IsAdmin")?.Value) 

इस के बजाय:

[HttpGet] 
public async Task<IActionResult> Get() 
{ 
    if (!User.IsAdmin) 
     return Forbid(); 

    // logic 
} 

मैं इस (या कुछ इसी तरह) चाहते हैं:

[AdminOnly] 
[HttpGet] 
public async Task<IActionResult> Get() 
{ 
    // logic 
} 

मैं

संदर्भ के लिए, User.IsAdmin इस के लिए आशुलिपि है बनाने के लिए source for [AuthorizeAttribute] को देखने का प्रयास करने की कोशिश की, लेकिन यह सिर्फ एक खोल है और मैं नहीं जानता ओउ जहां असली जादू होता है।

मैं इसे कैसे पूरा कर सकता हूं?

+4

मैं के बारे में नीति आधारित प्राधिकरण डॉक्स पढ़ सुझाव देते हैं, तो आप मूल रूप से एक का उपयोग करें नामित नीति के साथ विशेषता है तो आप कुछ भूमिका या दावे या अन्य नियम की आवश्यकता के लिए स्टार्टअप में नीति को परिभाषित करते हैं https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies –

+0

@blowdart (एएसपी.नेट कोर सुरक्षा के लिए ज़िम्मेदार) से उत्तर की जांच करें, आपको अपनी खुद की विशेषताओं को बनाने (या आवश्यकता नहीं है) – Tseng

+0

@JoeAudette ऐसा लगता है कि मुझे इसकी आवश्यकता है, यह सुनिश्चित नहीं है कि मुझे यह कैसे याद आया। :/[दावा-आधारित ऑथ] (https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims#adding-claims-checks) काम करेगा, क्योंकि मुझे केवल यह सत्यापित करने की आवश्यकता है कि दावा 'सच' है। यदि आप इसे उत्तर के रूप में जोड़ते हैं तो मैं इसे स्वीकार करूंगा। – vaindil

उत्तर

6

@JoeAudette द्वारा सुझाए गए समाधान का सबसे अच्छा विकल्प प्रतीत होता है।


Startup.cs में अपने स्वयं के नीति बनाएं:

options.AddPolicy("PolicyName", p => 
{ 
    p.RequireAuthenticatedUser(); 
    p.RequireClaim("IsAdmin", true); <- your criteria here (claim type, claim value) ??? 
    p.Build(); 
}); 


तो बस एक विशेषता के रूप में उपयोग:

[Authorize("PolicyName")]