নেটকোর এপিআই ৩.১ এ অনুমোদন ফিল্টারকন্টেক্সট পড়া


9

আমার একটি ওয়ার্কিং নেটकोर ২.২ প্রকল্প রয়েছে যেখানে আমি একটি কাস্টম নীতি প্রয়োগ করেছি যা এপিআই কীগুলির জন্য পরীক্ষা করে।

প্রারম্ভিকাগুলিতে আমি এই নীতিটি যুক্ত করছি

//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

এটি নেটকোর ৩.১ এ কাজ করে না

আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext' টাইপ করতে 'Microsoft.AspNetCore.Routing.RouteEndPoint' টাইপের অবজেক্ট কাস্ট করতে অক্ষম।

মূল 3 এবং তারপরে এটি করার সঠিক উপায় কী?

কার্ক লারকিনের নির্দেশ অনুসারে, নেট 3.0.০ এবং তারপরের সঠিক উপায়টি হ'ল হ্যান্ডলারের মধ্যে আইএইচটিপি কনটেক্সটএ্যাকসেসর ইনজেকশন করা এবং এটি ব্যবহার করা।

এই মুহুর্তে আমার প্রশ্ন হ'ল আমি কীভাবে এটি ইনজেক্ট করব? আমি স্টার্টআপ.কে এ পাস করতে পারছি না বা কমপক্ষে আমি কীভাবে দেখছি না।

কোন ধারণা / ইঙ্গিত অনেক প্রশংসা করা হবে।

উত্তর:


14

এএসপি.নেট কোর 3.0 এর পূর্ববর্তী সংস্করণগুলিতে, IAuthorizationHandlerএমভিসি পাইপলাইনের সময় বাস্তবায়নগুলি আহ্বান করা হয়েছিল। 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
এই ইঙ্গিতটির জন্য আপনাকে ধন্যবাদ। আমি এমন নীতি তৈরি করার চেষ্টা করছি যেখানে কোনও এপিআই কী অনুপস্থিত থাকলে কলটি প্রত্যাখ্যান করা হবে। আমরা কীভাবে আর // কী নীতি পরিষেবাদি যুক্ত করতে পারি না .এডএডরাইজেশন (বিকল্পগুলি => {বিকল্পসমূহ .এডডপলিসি ("অ্যাপকি", নীতি => নীতি। প্রয়োজনীয়তাগুলি dএড করুন (নতুন অ্যাপ্লিকরির প্রয়োজনীয়তা ()));}); যদি তা না হয় তবে আমি একটি কল একটি নিয়ামক ক্রিয়াকে আঘাত করার আগে কীভাবে তাকে আটকাতে পারি?
w2olves

1
হ্যাঁ, এটি এখনও আগের মতো কাজ করে।
লারকিন

কনস্ট্রাক্টর IHttpContextAccessor আশা করছেন আমি স্টার্টআপ। সি-তে যখন নীতি তৈরি করি তখন কীভাবে আমি এটি পাস করতে পারি? পরিষেবাদি.এডএডরাইজেশন (অপশন => {অপশনস। অ্যাডডপলিসি ("অ্যাপকি", নীতি => নীতি। প্রয়োজনীয়তা.এড যোগ করুন (নতুন অ্যাপকাইরকিয়ারমেন্ট ()));}); আমি AppKeyAuthorizationHandler এর জন্য একটি নতুন ডিফল্ট কনস্ট্রাক্টরও তৈরি করতে পারি তবে তারপরে httpContextAccessor.HttpContext; একটি অনুরোধ আসে যখন নাল? কোন ধারণা?
w2olves

1
আপনি ডিআই ব্যবহার করে আপনার হ্যান্ডলার যুক্ত করুন যা এটি আপনার জন্য একটি উদাহরণ তৈরি করে এবং পাস করে IHttpContextAccessorদস্তাবেজগুলি দেখুন ।
কার্ক লারকিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.