এএসপি.নেট এমভিসিতে অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-উত্স নির্ধারণ - সহজতম পদ্ধতি possible


206

আমার একটি সাধারণ অ্যাকশনমেডো আছে, এটি কিছু জসন দেয়। এটি আজাক্স.এক্সামেল.কম এ চলে। আমার অন্য সাইট সোয়েদারসাইট ডটকম থেকে এটি অ্যাক্সেস করা দরকার।

আমি যদি এটির কল করার চেষ্টা করি তবে আমি প্রত্যাশিত ...:

Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

আমি এর দুটি উপায় সম্পর্কে জানি: জেএসওএনপি এবং শিরোনাম সেট করার জন্য একটি কাস্টম এইচটিপিহ্যান্ডলার তৈরি করা ।

কোন সহজ উপায় আছে?

কোনও সাধারণ ক্রিয়াকলাপের দ্বারা অনুমোদিত মুল উত্সের তালিকা নির্ধারণ করা সম্ভব নয় - বা সাধারণ সবাইকে অনুমতি দেবে? অ্যাকশন ফিল্টার হতে পারে?

সর্বোত্তম হবে ...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);

1
VNext এবং MVC6 এর জন্য দয়া করে এখানে একবার দেখুন: নীলব্যাট
নীল

উত্তর:


381

সাধারণ এএসপি.এনইটি এমভিসি নিয়ন্ত্রণকারীদের জন্য

একটি নতুন বৈশিষ্ট্য তৈরি করুন

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}

আপনার ক্রিয়া ট্যাগ করুন:

[AllowCrossSiteJson]
public ActionResult YourMethod()
{
    return Json("Works better?");
}

ASP.NET ওয়েব API এর জন্য

using System;
using System.Web.Http.Filters;

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
}

একটি সম্পূর্ণ API নিয়ামক ট্যাগ করুন:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

বা পৃথক এপিআই কলগুলি:

[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
    ...
}

ইন্টারনেট এক্সপ্লোরার <= v9 এর জন্য

IE <= 9 CORS সমর্থন করে না। আমি একটি জাভাস্ক্রিপ্ট লিখেছি যা স্বয়ংক্রিয়ভাবে একটি প্রক্সি মাধ্যমে এই অনুরোধগুলি রুট করবে। এটি সমস্ত 100% স্বচ্ছ (আপনাকে কেবল আমার প্রক্সি এবং স্ক্রিপ্টটি অন্তর্ভুক্ত করতে হবে)।

নুগেট ব্যবহার করে এটি ডাউনলোড corsproxyকরুন এবং অন্তর্ভুক্ত নির্দেশাবলী অনুসরণ করুন।

ব্লগ পোস্ট | সোর্স কোড


8
অ্যামেজিং! আমি এমভিসি + ইউ প্রেম!
পাইওটার কুলা

2
এই সমাধানের কমনীয়তায় বিস্ময়ে
ব্র্যাভিনিউমথ

3
আপনি যদি নিজের নিজস্ব ডোমেনগুলিতে সিওআর সীমাবদ্ধ করতে চান তবে আপনি সহজেই নির্দিষ্ট উত্সটি গ্রহণ করার জন্য বৈশিষ্ট্যটি প্রসারিত করতে পারেন।
পেট্রাস থেরন

2
আপনার এটিকে আপনার App_Start in FilterConfig- এ সঠিকভাবে RegisterHttpFilters- এ যুক্ত করতে সক্ষম হবেন? এটি করা আপনার প্রকল্পের সমস্ত এপিআই কন্ট্রোলারের ক্ষেত্রে এটি প্রয়োগ করবে। উপরের পেটের মন্তব্যে এটি সংযুক্ত করে আপনি সমস্ত কন্ট্রোলারের জন্য আপনার ডোমেনে (গুলি) সীমাবদ্ধ করতে পারেন।
বিডওয়াকফিল্ড

9
আমি সম্প্রতি আমাদের প্রকল্পকে এমভিসি 5 তে আপডেট করেছি এবং এটি করার চেষ্টা করেছি। এমনকি কোনও ফিল্টারে শিরোনাম যুক্ত করাও কাজ করে বলে মনে হচ্ছে না। আমি যখন নেটওয়ার্কটিতে অনুরোধটি দেখি তখন শিরোনাম প্রতিক্রিয়াটিতে উপস্থিত হয় না। এটি কাজ করার জন্য আরও কিছু করার দরকার আছে যা?
হাঁটুমিন

121

আপনি যদি আইআইএস 7+ ব্যবহার করেন তবে আপনি সিস্টেম.ওয়েব সার্ভার বিভাগে এটি দিয়ে ফোল্ডারের মূলের মধ্যে একটি ওয়েবকনফিগ ফাইলটি রাখতে পারেন:

<httpProtocol>
   <customHeaders>
      <clear />
      <add name="Access-Control-Allow-Origin" value="*" />
   </customHeaders>
</httpProtocol>

দেখুন: http://msdn.microsoft.com/en-us/library/ms178685.aspx এবং: http://enable-cors.org/#how-iis7


1
আমি কেন আর মনে করতে পারি না, তবে এই পদ্ধতিটি আইআইএস 7+ এ সবসময় কাজ করে না
লন্ড্রোম্যাট

হুম। আমি মনে করতে পারি যে এটি কাজ করবে না কেবল কারণ যদি কোনও অনুরোধ একটি নন-সিওআর ব্রাউজার থেকে উত্পন্ন হয়। তবে তদন্ত চালিয়ে যাব।
বিক্রয়মাদোগ

29
এছাড়াও, এটি সম্পূর্ণ ওয়েবসাইটকে কর্স-বান্ধব করে তুলবে। যদি কেউ কেবল একটি একক ক্রিয়া বা নিয়ন্ত্রণকারীকে কর্স-বান্ধব হিসাবে চিহ্নিত করতে চান তবে গৃহীত উত্তরটি আরও ভাল।
লেভ ডুবিনেটস

1
যদি আপনি দেখেন ASP.Net অধ্যায়, এটি একটি হয়েছে ইঙ্গিতটি : "নোট: এই পদ্ধতির IIS6, IIS7 ক্লাসিক মোড, এবং IIS7 ইন্টিগ্রেটেড মোড সঙ্গে সামঞ্জস্যপূর্ণ।"
পেরেসবাস

1
আমি যখন আমার অ্যাপটি শেয়ারপয়েন্ট পরিবেশে প্রকাশ করি তখন আমি ক্রস-ডোমেন সমস্যার মুখোমুখি। আমি যখন স্থানীয় পরিবেশে আমার অ্যাপ্লিকেশন চালনা করি তখন আমার অ্যাপ্লিকেশনটি ঠিকঠাক হয়ে যায়, তবে আমি যখন এটি আমার শেয়ারপয়েন্ট সাইটটিতে অ্যাজুরিতে প্রকাশ করি তখন এটি অজ্যাক্স.ব্যাগিন ফর্ম কলটিতে ত্রুটি পৃষ্ঠায় পুনঃনির্দেশ করে। আমি এই সমাধানটি চেষ্টা করেছিলাম কিন্তু এটি আমার পক্ষে কাজ করে না। এর বিকল্প আছে কি?
জ্যোৎস্না ওয়াদওয়ানি

22

আমি একটি সমস্যায় পড়েছি যেখানে ব্রাউজারটি অনুরোধটি কুকিগুলিতে পাস করার সময় এটি পুনরুদ্ধার করা সামগ্রীটি পরিবেশন করতে অস্বীকার করেছিল (উদাহরণস্বরূপ, এক্সএইচআর এর রয়েছে withCredentials=true), এবং সাইটটি Access-Control-Allow-Originসেট হয়ে গেছে *। (ক্রোমের ত্রুটিটি ছিল, "শংসাপত্রগুলির পতাকাটি সত্য হলে অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্সে ওয়াইল্ডকার্ড ব্যবহার করতে পারবেন না))"

@ জাগাফিনের উত্তরের ভিত্তিতে আমি এটি তৈরি করেছি, যা মূলত সেই নির্দিষ্ট ব্রাউজার সুরক্ষা চেকের চারপাশে কাজ করার একটি উপায়, তাই ক্যাভেট এমপোটার।

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // We'd normally just use "*" for the allow-origin header, 
        // but Chrome (and perhaps others) won't allow you to use authentication if
        // the header is set to "*".
        // TODO: Check elsewhere to see if the origin is actually on the list of trusted domains.
        var ctx = filterContext.RequestContext.HttpContext;
        var origin = ctx.Request.Headers["Origin"];
        var allowOrigin = !string.IsNullOrWhiteSpace(origin) ? origin : "*";
        ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin);
        ctx.Response.AddHeader("Access-Control-Allow-Headers", "*");
        ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
        base.OnActionExecuting(filterContext);
    }
}

এটি বিশেষভাবে দরকারী ছিল, আপনাকে ধন্যবাদ।
cklimowski

15

এটি সত্যিই সহজ, কেবল এটি ওয়েবকনফাইগে যুক্ত করুন

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="http://localhost" />
      <add name="Access-Control-Allow-Headers" value="X-AspNet-Version,X-Powered-By,Date,Server,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Content-Length,Content-Type,Host,Origin,Pragma,Referer,User-Agent" />
      <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
      <add name="Access-Control-Max-Age" value="1000" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

অরিজিনে আপনার ওয়েব সার্ভারটিতে অ্যাক্সেস রয়েছে এমন সমস্ত ডোমেন রাখুন, শিরোনামগুলিতে কোনও অ্যাজাক্স HTTP অনুরোধ যে সমস্ত সম্ভাব্য শিরোনাম ব্যবহার করতে পারে সেগুলিতে রাখে, পদ্ধতিগুলিতে আপনি আপনার সার্ভারে অনুমতিপ্রাপ্ত সমস্ত পদ্ধতি রাখেন

শুভেচ্ছা :)


অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-শিরোনামগুলিতে "অনুমোদন" যুক্ত করা যদি আপনি অনুমোদিত প্রশ্নগুলি ব্যবহার করতে চান তবে দরকারীও হতে পারে।
17

9

কখনও কখনও অপশন ক্রিয়া পাশাপাশি সমস্যা সৃষ্টি করে

সহজভাবে: নিম্নলিখিতগুলির সাথে আপনার ওয়েবকনফিগ আপডেট করুন

<system.webServer>
    <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

এবং HTGet এবং httpOptions সহ ওয়েবসার্ভিস / নিয়ন্ত্রক শিরোনাম আপডেট করুন

// GET api/Master/Sync/?version=12121
        [HttpGet][HttpOptions]
        public dynamic Sync(string version) 
        {

বিটিডাব্লু, সাইটফিনিটিতে আপনাকে সুরক্ষা বিভাগে সিস্টেমের উন্নত সেটিংসে * যুক্ত করতে হবে
বিশ্বে হান্না

কন্ট্রোলার শিরোনামগুলি আপডেট করার জন্য আমার যে ফাইলগুলি দরকার?
ব্যবহারকারী 3281466

8

ওয়েবএপিআই ২-এ এখন সিওআরএসের জন্য একটি প্যাকেজ রয়েছে যা ব্যবহার করে ইনস্টল করা যেতে পারে: ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.অ্যাস্পনেট.ওয়েবপিপি.কর্স-প্রাক-প্রকল্পের ওয়েবসার্কিক

এটি ইনস্টল হয়ে গেলে, কোডটির জন্য এটি অনুসরণ করুন :


5

আপনার পদ্ধতিতে এই লাইনটি যুক্ত করুন, আপনি যদি কোনও এপিআই ব্যবহার করেন।

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

4

এই টিউটোরিয়ালটি খুব দরকারী। একটি দ্রুত সংক্ষিপ্ত বিবরণ দিতে:

  1. নুগেটে উপলব্ধ সিওআরএস প্যাকেজটি ব্যবহার করুন: Install-Package Microsoft.AspNet.WebApi.Cors

  2. আপনার WebApiConfig.csফাইল, যোগ config.EnableCors()করার Register()পদ্ধতি।

  3. আপনার নিয়ন্ত্রণ করা নিয়ন্ত্রণকারীদের একটি বৈশিষ্ট্য যুক্ত করুন:

[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]


আমাকে এই পদ্ধতিটি ব্যবহার করতে হয়েছিল কারণ আমার অনুরোধে একটি কাস্টম শিরোনাম সেট করার দরকার ছিল এবং কাস্টম বৈশিষ্ট্য পদ্ধতিটি ব্রাউজারগুলির প্রাক-উড়ানের অনুরোধের সাথে কাজ করে না। এটি সব ক্ষেত্রেই কাজ করে বলে মনে হচ্ছে।
lehn0058

3
    public ActionResult ActionName(string ReqParam1, string ReqParam2, string ReqParam3, string ReqParam4)
    {
        this.ControllerContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin","*");
         /*
                --Your code goes here --
         */
        return Json(new { ReturnData= "Data to be returned", Success=true }, JsonRequestBehavior.AllowGet);
    }

2

অ্যাক্সেস-কন্ট্রোল-এক্সপোজ-শিরোনামগুলি পাস করার বিভিন্ন উপায় রয়েছে।

  • Jgauffin যেমন ব্যাখ্যা করেছে আমরা একটি নতুন বৈশিষ্ট্য তৈরি করতে পারি।
  • লন্ড্রোম্যাট যেমন ব্যাখ্যা করেছে আমরা ওয়েবকনফিগ ফাইলটিতে যুক্ত করতে পারি।
  • আরেকটি উপায় হ'ল আমরা ওয়েবএপিকনফিগ.সি ফাইলগুলিতে নীচের মতো কোড যুক্ত করতে পারি।

    config.EnableCors (নতুন সক্ষম করুনঅ্যাট্রিবিউট (" ", শিরোনাম: " ", পদ্ধতি: "*", এক্সপোজহাইডার্স: "টেস্টহিডারটোস এক্সপোজ") {সাপোর্টস্রেডিয়েন্টস = সত্য;);

অথবা আমরা গ্লোবাল.এক্স ফাইল ফাইলের নীচে কোড যুক্ত করতে পারি।

protected void Application_BeginRequest()
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
                HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
                HttpContext.Current.Response.End();
            }
        }

আমি এটি বিকল্প জন্য লিখেছি। আপনার প্রয়োজন অনুসারে একই পরিবর্তন করুন।

শুভ কোডিং !!


1

পুরো সন্ধ্যার জন্য লড়াই করার পরে অবশেষে আমি এটি কাজে পেলাম। কিছুটা ডিবাগিংয়ের পরে আমি যে সমস্যাটি চালাচ্ছিলাম তা হ'ল আমার ক্লায়েন্টটি তথাকথিত উত্স, পদ্ধতি এবং শিরোনামগুলির সাথে পোস্টের অনুরোধ প্রেরণ করার অনুমতি দেয় কিনা তা পরীক্ষা করার জন্য একটি তথাকথিত প্রিফলাইট বিকল্পগুলির অনুরোধ পাঠাচ্ছিল। আমি ওউইন বা একটি অ্যাপিকন্ট্রোলার ব্যবহার করতে চাইনি, তাই আমি খনন শুরু করেছিলাম এবং কেবলমাত্র একটি অ্যাকশনফিলারঅ্যাট্রিবিউট দিয়ে নিম্নলিখিত সমাধানটি নিয়ে এসেছি। বিশেষত "অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-শিরোনামগুলি" অংশটি খুব গুরুত্বপূর্ণ, কারণ সেখানে উল্লিখিত শিরোনামগুলির সাথে আপনার অনুরোধ প্রেরিত শিরোনামগুলির সাথে মিল রাখতে হবে।

using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyNamespace
{
    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpRequest request = HttpContext.Current.Request;
            HttpResponse response = HttpContext.Current.Response;

            // check for preflight request
            if (request.Headers.AllKeys.Contains("Origin") && request.HttpMethod == "OPTIONS")
            {
                response.AppendHeader("Access-Control-Allow-Origin", "*");
                response.AppendHeader("Access-Control-Allow-Credentials", "true");
                response.AppendHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
                response.AppendHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-RequestDigest, Cache-Control, Content-Type, Accept, Access-Control-Allow-Origin, Session, odata-version");
                response.End();
            }
            else
            {
                HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                HttpContext.Current.Response.Cache.SetNoStore();

                response.AppendHeader("Access-Control-Allow-Origin", "*");
                response.AppendHeader("Access-Control-Allow-Credentials", "true");
                if (request.HttpMethod == "POST")
                {
                    response.AppendHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
                    response.AppendHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-RequestDigest, Cache-Control, Content-Type, Accept, Access-Control-Allow-Origin, Session, odata-version");
                }

                base.OnActionExecuting(filterContext);
            }
        }
    }
}

অবশেষে, আমার এমভিসি অ্যাকশন পদ্ধতিটি এর মতো দেখাচ্ছে। গুরুত্বপূর্ণ এখানে অপশন এইচটিটিপি ভার্বসের কথাও উল্লেখ করা হয়েছে, কারণ অন্যথায় প্রিফলাইট অনুরোধটি ব্যর্থ হবে।

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Options)]
[AllowCrossSiteJson]
public async Task<ActionResult> Create(MyModel model)
{
    return Json(await DoSomething(model));
}

0

Web.config এ নিম্নলিখিত লিখুন

<system.webServer>
<httpProtocol>
  <customHeaders>
    <clear />     
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Origin" value="http://localhost:123456(etc)" />
  </customHeaders>
</httpProtocol>

0

আপনি যদি আইআইএস ব্যবহার করেন তবে আমি আইআইএস করস মডিউলটি চেষ্টা করার পরামর্শ দেব ।
এটি কনফিগার করা সহজ এবং সব ধরণের নিয়ন্ত্রকের জন্য কাজ করে।

কনফিগারেশনের একটি উদাহরণ এখানে দেওয়া হয়েছে:

    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="*" />
            <add origin="https://*.microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add origin="http://*" allowed="false" />
        </cors>
    </system.webServer>

0

আমি ডটনেট কোর এমভিসি ব্যবহার করছি এবং নুগেট প্যাকেজ, স্টার্টআপ.সি, বৈশিষ্ট্য এবং এই জায়গাটির সাথে কয়েক ঘন্টা লড়াই করার পরে, আমি কেবল এমভিসি ক্রিয়ায় এটি যুক্ত করেছি:

Response.Headers.Add("Access-Control-Allow-Origin", "*");

আমি বুঝতে পেরেছি যে এটি বেশ জঘন্য, তবে এটির জন্য আমার যা দরকার তা ছিল এবং অন্য কোনও কিছুই those শিরোনামগুলি যুক্ত করতে চায় নি। আমি আশা করি এটি অন্য কাউকে সাহায্য করবে!

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