नेटकोर एपीआई 3.1 में ऑथराइजेशनफिल्टर कॉन्टेक्स्ट पढ़ना


11

मेरे पास एक काम करने वाली नेटकोर 2.2 परियोजना है जहां मैंने एक कस्टम नीति लागू की है जो एपीआई कीज़ के लिए जांच करती है।

Startup.cs में मैं इस नीति को इस तरह जोड़ रहा हूं

//Add Key Policy
services.AddAuthorization(options =>
{
    options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});

मेरे AppKeyRequirement में मुझे प्राधिकरणहैंडलर से विरासत में मिला है और इस तरह आने वाले अनुरोधों में कुंजियों को हल करता है

protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
    var authorizationFilterContext = (AuthorizationFilterContext)authContext.Resource;
    var query = authorizationFilterContext.HttpContext.Request.Query;

    if (query.ContainsKey("key") && query.ContainsKey("app"))
    { // Do stuff

यह netcore 3.1 में काम नहीं करता है

मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

'Microsoft.AspNetCore.Rout.RouteEndpoint' टाइप की ऑब्जेक्ट को 'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext' टाइप करने में असमर्थ।

कोर 3 और इसके बाद के संस्करण में ऐसा करने का सही तरीका क्या है?

जैसा कि कर्क लार्किन ने बताया है, .net 3.0 और इसके बाद के संस्करण में सही तरीका है IHttpContextAccessor को प्रामाणिक हैंडलर में इंजेक्ट करना और उसका उपयोग करना।

इस बिंदु पर मेरा सवाल यह है कि मैं इसे कैसे इंजेक्ट करूं? मैं इसे स्टार्टअप में पास नहीं कर सकता। या कम से कम मैं यह नहीं देख रहा हूं कि कैसे।

किसी भी विचार / संकेत बहुत सराहना की जाएगी।

जवाबों:


17

ASP.NET Core 3.0 से पहले के संस्करणों में, IAuthorizationHandlerMVC पाइपलाइन के दौरान कार्यान्वयन कहा जाता था। 3.0 बाद में, जो एंडपॉइंट-रूटिंग (डिफ़ॉल्ट रूप से) का उपयोग करता है, इन कार्यान्वयनों को प्राधिकरण मिडलवेयर ( UseAuthorization()) द्वारा कहा जाता है । यह मिडलवेयर MVC पाइपलाइन से पहले चलता है , बल्कि इसके हिस्से के रूप में।

इस परिवर्तन का अर्थ है कि AuthorizationFilterContextअब प्राधिकरण संचालकों को पारित नहीं किया गया है। इसके बजाय, यह एक उदाहरण है RouteEndpoint, जो तक पहुँच प्रदान नहीं करता है HttpContext

अपने उदाहरण में, आप केवल AuthorizationFilterContextपकड़ पाने के लिए उपयोग कर रहे हैं HttpContext। 3.0+ में, IHttpContextAccessorअपने प्राधिकरण हैंडलर में इंजेक्ट करें और उसका उपयोग करें। यहां पूर्णता के लिए एक उदाहरण दिया गया है:

public class AppKeyAuthorizationHandler : AuthorizationHandler<AppKeyRequirement>
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public AppKeyAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
    {
        var httpContext = httpContextAccessor.HttpContext;
        var query = httpContext.Request.Query;

        if (query.ContainsKey("key") && query.ContainsKey("app"))
        {
            // ...
        }
    }
}

आपको इसमें पंजीकरण करना भी पड़ सकता IHttpContextAccessorहै ConfigureServices:

services.AddHttpContextAccessor();

उपयोग करने के बारे में अधिक जानकारी के लिए कस्टम घटकों से HttpContext का उपयोग करें देखें IHttpContextAccessor


1
इस संकेत के लिए धन्यवाद। मैं एक पॉलिसी बनाने की कोशिश कर रहा हूं, जहां अगर कोई एपीआई कुंजी गायब है तो कॉल अस्वीकार कर दिया जाएगा। क्या हम अब मुख्य नीति सेवाओं का उपयोग नहीं कर सकते हैं। Add_uthorization (विकल्प => {options.AddPolicy ("AppKey", नीति => policy.Requirements.Add (नई AppKeyRequirement ()));});) यदि नहीं, तो एक नियंत्रक कार्रवाई को हिट करने से पहले मैं कॉल को कैसे रोक सकता हूं?
w2olves 0

1
हां, वह पहले की तरह ही काम करता है।
कर्क लर्किन

कंस्ट्रक्टर IHttpContextAccessor से अपेक्षा कर रहा है कि स्टार्टअप में जब मैं पॉलिसी बनाऊंगा तो मैं इसे कैसे पास कर सकता हूं? services .ddAuthorization (विकल्प => {Options.AddPolicy ("AppKey", नीति => नीति। असमानताएं) .dd (नया AppKeyRequirement ()));}); मैं AppKeyAuthorizationHandler के लिए एक नया डिफ़ॉल्ट निर्माता भी बना सकता हूं, लेकिन फिर httpContextAccessor.HttpContext; जब कोई अनुरोध आता है तो अशक्त है।
18

1
आप अपने हैंडलर को DI का उपयोग करके जोड़ते हैं, जो आपके लिए इसका एक उदाहरण बनाता है और में गुजरता है IHttpContextAccessorडॉक्स देखें ।
कर्क लार्किन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.