একাধিক ডোমেন সহ অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি-উত্স


102

আমার ওয়েব কনফিগে আমি access-control-allow-originনির্দেশের জন্য একাধিক ডোমেন নির্দিষ্ট করতে চাই । আমি ব্যবহার করতে চাই না *। আমি এই বাক্য গঠন চেষ্টা করেছি:

<add name="Access-Control-Allow-Origin" value="http://localhost:1506, http://localhost:1502" />

এইটা

<add name="Access-Control-Allow-Origin" value="http://localhost:1506 http://localhost:1502" />

এইটা

<add name="Access-Control-Allow-Origin" value="http://localhost:1506; http://localhost:1502" />

এবং এটি

<add name="Access-Control-Allow-Origin" value="http://localhost:1506" />
<add name="Access-Control-Allow-Origin" value="http://localhost:1502" />

কিন্তু তাদের কেউ কাজ করে না। সঠিক বাক্য গঠন কী?

উত্তর:


80

কেবলমাত্র একটি Access-Control-Allow-Originপ্রতিক্রিয়া শিরোনাম থাকতে পারে এবং সেই শিরোনামটির কেবলমাত্র একটির মূল মূল্য থাকতে পারে। অতএব, এটি কাজ করার জন্য আপনার কিছু কোড থাকা দরকার যা:

  1. Grabs Originঅনুরোধ শীর্ষক।
  2. মূল মান শ্বেত তালিকাভুক্ত মানগুলির মধ্যে একটি কিনা তা পরীক্ষা করে।
  3. যদি এটি বৈধ Access-Control-Allow-Originহয় তবে মানটি দিয়ে শিরোনামটি সেট করে ।

আমি মনে করি না এটি সম্পূর্ণভাবে ওয়েবকনফাইগের মাধ্যমে করার কোনও উপায় আছে।

if (ValidateRequest()) {
    Response.Headers.Remove("Access-Control-Allow-Origin");
    Response.AddHeader("Access-Control-Allow-Origin", Request.UrlReferrer.GetLeftPart(UriPartial.Authority));

    Response.Headers.Remove("Access-Control-Allow-Credentials");
    Response.AddHeader("Access-Control-Allow-Credentials", "true");

    Response.Headers.Remove("Access-Control-Allow-Methods");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
}

4
যে আমার প্রশ্নের উত্তর। আমি নিশ্চিত না যে মাইক্রোসফ্ট যদিও ওয়েলকনফিগে একাধিক উত্স নির্দিষ্ট করার অনুমতি দেয় না ....
স্যাম

17
আমি এই কোডটি কোথায় যুক্ত করতে পারি? আমার সার্ভারের মাধ্যমে উত্পন্ন পাঠ্য ফাইল রয়েছে এবং এজেএক্সের মাধ্যমে পড়েছি, কোনও কোড নেই। আমার ডিরেক্টরিতে টেক্সট ফাইলগুলিতে অ্যাক্সেস সীমাবদ্ধ করার জন্য আমি কোডটি কোথায় রাখতে পারি?
হ্যারি

4
@ সিমন_উইভারের এমন একটি *মান রয়েছে যা যে কোনও উত্সকে উত্স অ্যাক্সেস করতে দেয়। তবে আসল প্রশ্নটি একটি ডোমেনের সেটকে হোয়াইটলিস্ট করার বিষয়ে জিজ্ঞাসা করেছিল।
মনসুর

4
আমি যেমন এসপি। নেট তে নতুন আমি কী জিজ্ঞাসা করতে পারি আমি আমার এসপি। নেট ওয়েব এপিআই প্রকল্পে এই কোডটি কোথায় রাখতে পারি?
অমৃত

96

আইআইএস 7.5+ এবং পুনর্লিখন 2.0 এর জন্য আপনি ব্যবহার করতে পারেন:

<system.webServer>
   <httpProtocol>
     <customHeaders>
         <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
         <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
     </customHeaders>
   </httpProtocol>
        <rewrite>            
            <outboundRules>
                <clear />                
                <rule name="AddCrossDomainHeader">
                    <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                        <add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?domain1\.com|(.+\.)?domain2\.com|(.+\.)?domain3\.com))" />
                    </conditions>
                    <action type="Rewrite" value="{C:0}" />
                </rule>           
            </outboundRules>
        </rewrite>
 </system.webServer>

সার্ভারের ভেরিয়েবল RESPONSE_Access_Control_Allow_Originঅংশটি ব্যাখ্যা :
পুনর্লিখনের পরে আপনি যে কোনও স্ট্রিং ব্যবহার করতে পারেন RESPONSE_এবং এটি শিরোনামের নাম হিসাবে বাকী শব্দটি ব্যবহার করে প্রতিক্রিয়া শিরোনাম তৈরি করবে (এই ক্ষেত্রে অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স)। পুনর্লিখন ড্যাশগুলির পরিবর্তে "_" আন্ডারস্কোর ব্যবহার করে "-" (পুনর্লিখন এগুলি ড্যাশে রূপান্তর করে)

সার্ভার ভেরিয়েবলের ব্যাখ্যা HTTP_ORIGIN:
একইভাবে, পুনর্লিখনে আপনি HTTP_উপসর্গ হিসাবে কোনও অনুরোধ শিরোনাম দখল করতে পারেন । ড্যাশগুলির সাথে একই নিয়ম (ড্যাশগুলির পরিবর্তে "_" আন্ডারস্কোর ব্যবহার করুন "-")।


এটি আইআইএস 7.5 এর সাথে কাজ করবে না এমন কোনও কারণ আপনি ভাবতে পারেন?
ফিল রিকিটস 10

আমি মনে করি এটি কাজ করা উচিত। আমি আইআইএস 8.5 সংস্করণটি নির্দিষ্ট করেছি কারণ এটিই আমি এটি পরীক্ষা করেছি।
পাকো জারাতে

4
@ পাকোজারেট ভাল লাগছে, দুর্দান্ত টিপ। রেজেক্সকে সহজ করার জন্য এবং এটিকে আরও জেনেরিক করতে আপনি ব্যবহার করতে পারেন - (http(s)?:\/\/((.+\.)?(domain1|domain2)\.(com|org|net)))। এইভাবে আপনি অন্যান্য ডোমেনগুলি মোটামুটি সহজভাবে যুক্ত করতে পারেন এবং একাধিক শীর্ষ-স্তরের ডোমেনগুলি সমর্থন করতে পারেন (উদাঃ com, org, নেট ইত্যাদি)।
মার্লিন

4
সবেমাত্র আইআইএস 7.5 এ এটি ব্যবহার করে দেখেছি। মনে হচ্ছে ঠিক কাজ করছে।
প্রেসিডেন্ট

4
ক্যাশে নিয়ে সমস্যা হচ্ছে? ওয়েবকনফিগ টুইট করার পরে, প্রথম ওয়েবসাইটটি আমি সূক্ষ্ম ম্যাচগুলিতে যাই, তবে দ্বিতীয়টি প্রথম হিসাবে একই শিরোনামটি দেয়। এইভাবে ডোমেনগুলির খুব বেশি মিল নেই causing
এয়ারএন 57575

21

ওয়েব.এপআই-তে এই বৈশিষ্ট্যটি http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-apiMicrosoft.AspNet.WebApi.Cors তে বিস্তারিত হিসাবে ব্যবহার করে যুক্ত করা যেতে পারে

এমভিসিতে আপনি এই কাজটি করতে একটি ফিল্টার বৈশিষ্ট্য তৈরি করতে পারেন:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
                AllowMultiple = true, Inherited = true)]
public class EnableCorsAttribute : FilterAttribute, IActionFilter {
    private const string IncomingOriginHeader = "Origin";
    private const string OutgoingOriginHeader = "Access-Control-Allow-Origin";
    private const string OutgoingMethodsHeader = "Access-Control-Allow-Methods";
    private const string OutgoingAgeHeader = "Access-Control-Max-Age";

    public void OnActionExecuted(ActionExecutedContext filterContext) {
        // Do nothing
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var isLocal = filterContext.HttpContext.Request.IsLocal;
        var originHeader = 
             filterContext.HttpContext.Request.Headers.Get(IncomingOriginHeader);
        var response = filterContext.HttpContext.Response;

        if (!String.IsNullOrWhiteSpace(originHeader) &&
            (isLocal || IsAllowedOrigin(originHeader))) {
            response.AddHeader(OutgoingOriginHeader, originHeader);
            response.AddHeader(OutgoingMethodsHeader, "GET,POST,OPTIONS");
            response.AddHeader(OutgoingAgeHeader, "3600");
        }
    }

    protected bool IsAllowedOrigin(string origin) {
        // ** replace with your own logic to check the origin header
        return true;
    }
}

তারপরে হয় তা নির্দিষ্ট ক্রিয়া / নিয়ন্ত্রকদের জন্য এটি সক্ষম করুন:

[EnableCors]
public class SecurityController : Controller {
    // *snip*
    [EnableCors]
    public ActionResult SignIn(Guid key, string email, string password) {

বা গ্লোবাল.এক্সএক্স.সি.এতে সমস্ত নিয়ন্ত্রকের জন্য এটি যুক্ত করুন

protected void Application_Start() {
    // *Snip* any existing code

    // Register global filter
    GlobalFilters.Filters.Add(new EnableCorsAttribute());
    RegisterGlobalFilters(GlobalFilters.Filters);

    // *snip* existing code
}

আপনি কী জানেন যে নেট / এমভিসি এর জন্য কোন সংস্করণ কাজ করে?
কেয়াব 42

আমি এটি নেট। 4 / এমভিসি 3 এ সফলভাবে ব্যবহার করছি - যতদূর আমি জানি এটি উচ্চতর সংস্করণগুলিতে কাজ করা উচিত তবে পরবর্তীকালে এমভিসি সংস্করণগুলিতে বৈশ্বিক ফিল্টারটি নিবন্ধিত করার পক্ষে পছন্দনীয় উপায় থাকতে পারে।
রব চার্চ

কেবল দয়া করে এর ওয়েবে এপিআই 2 সমাধানটি দ্রষ্টব্য। WEB API 1. এর জন্য নয়
সামিহ এ

5

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

এই সমাধানটি ভালভাবে কাজ করছে কারণ এটি আপনাকে আপনার নিয়ন্ত্রণকারীর সক্ষমযোগ্য বৈশিষ্ট্যগুলিতে হারকোড করার পরিবর্তে ওয়েবকনফিগ (অ্যাপসেটেটিং )গুলিতে শ্বেত তালিকাভুক্ত ডোমেনগুলি দেয়।

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class EnableCorsByAppSettingAttribute : Attribute, ICorsPolicyProvider
{
    const string defaultKey = "whiteListDomainCors";
    private readonly string rawOrigins;
    private CorsPolicy corsPolicy;

    /// <summary>
    /// By default uses "cors:AllowedOrigins" AppSetting key
    /// </summary>
    public EnableCorsByAppSettingAttribute()
        : this(defaultKey) // Use default AppSetting key
    {
    }

    /// <summary>
    /// Enables Cross Origin
    /// </summary>
    /// <param name="appSettingKey">AppSetting key that defines valid origins</param>
    public EnableCorsByAppSettingAttribute(string appSettingKey)
    {
        // Collect comma separated origins
        this.rawOrigins = AppSettings.whiteListDomainCors;
        this.BuildCorsPolicy();
    }

    /// <summary>
    /// Build Cors policy
    /// </summary>
    private void BuildCorsPolicy()
    {
        bool allowAnyHeader = String.IsNullOrEmpty(this.Headers) || this.Headers == "*";
        bool allowAnyMethod = String.IsNullOrEmpty(this.Methods) || this.Methods == "*";

        this.corsPolicy = new CorsPolicy
        {
            AllowAnyHeader = allowAnyHeader,
            AllowAnyMethod = allowAnyMethod,
        };

        // Add origins from app setting value
        this.corsPolicy.Origins.AddCommaSeperatedValues(this.rawOrigins);
        this.corsPolicy.Headers.AddCommaSeperatedValues(this.Headers);
        this.corsPolicy.Methods.AddCommaSeperatedValues(this.Methods);
    }

    public string Headers { get; set; }
    public string Methods { get; set; }

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request,
                                               CancellationToken cancellationToken)
    {
        return Task.FromResult(this.corsPolicy);
    }
}

    internal static class CollectionExtensions
{
    public static void AddCommaSeperatedValues(this ICollection<string> current, string raw)
    {
        if (current == null)
        {
            return;
        }

        var paths = new List<string>(AppSettings.whiteListDomainCors.Split(new char[] { ',' }));
        foreach (var value in paths)
        {
            current.Add(value);
        }
    }
}

আমি এই গাইডটি অনলাইনে পেয়েছি এবং এটি একটি কবজির মতো কাজ করেছে:

http://jnye.co/Posts/2032/dynamic-cors-origins-from-appsettings- using-web-api-2-2-cross-origin-support

আমি ভেবেছিলাম যে এটি প্রয়োজনের জন্য এখানে রেখে দেব।


এটি একটি লিঙ্ক-কেবল উত্তর। পরিবর্তে উত্তরটি নিজের পক্ষে দাঁড় করুন।
আনস্ল্যান্ডার মনিকা

4
ঠিক আছে, আমি এখানে নতুন, এটি কি এর মতো হওয়ার মতো বলে মনে হচ্ছে ??
হেল্পা

3

আমি 'মনসুর' পরামর্শের পরে অনুরোধ হ্যান্ডলিং কোডে এটি সমাধান করতে পেরেছি।

string origin = WebOperationContext.Current.IncomingRequest.Headers.Get("Origin");

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", origin);

উদাহরণস্বরূপ ওয়েবফর্মে এটি করার উপায়। সহজলভ্যভাবে অনুরোধটি ব্যবহার করুন when যখন পাওয়া যায় তখন হিডর। এবং, প্রয়োজন হলে শুধুমাত্র অনুমোদিত ডোমেনগুলি ফিল্টার করতে একটি শ্বেত তালিকা ব্যবহার করুন।
এফ্র্যাক্ট


3

আইআইএস 7.5+ এর জন্য আপনি আইআইএস করস মডিউলটি ব্যবহার করতে পারেন: https://www.iis.net/downloads/microsoft/iis-cors-module

আপনার ওয়েব.কমফিগটি এমন কিছু হওয়া উচিত:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="http://localhost:1506">
                <allowMethods>                    
                    <add method="GET" />
                    <add method="HEAD" />
                    <add method="POST" />
                    <add method="PUT" /> 
                    <add method="DELETE" /> 
                </allowMethods>
            </add>
            <add origin="http://localhost:1502">
                <allowMethods>
                    <add method="GET" />
                    <add method="HEAD" />
                    <add method="POST" />
                    <add method="PUT" /> 
                    <add method="DELETE" /> 
                </allowMethods>
            </add>
        </cors>
    </system.webServer>
</configuration>

আপনি এখানে কনফিগারেশন রেফারেন্সটি পেতে পারেন: https://docs.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configration-references


এটি যদি এটির মতো কাজ করে তবে আমি ইচ্ছা করি আপনি এই পোস্টটি 3 বছর আগে পোস্ট করেছেন! ওহ!
মাইকেল

2

থিঙ্কটেকচার আইডেন্টিটি মডেল লাইব্রেরিটি দেখুন - এতে সম্পূর্ণ সিওআর সমর্থন রয়েছে:

http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture- stateitymodel/

এবং এটি আপনার যে ACA- উত্সটি চান তা গতিময়ভাবে নির্গত করতে পারে।


এটি সত্যিই দরকারী লাইব্রেরির মতো মনে হচ্ছে। লিঙ্কের জন্য ধন্যবাদ।
স্যাম

1

আপনি এই কোডটি আপনার এসপিএন ওয়েবপিআই প্রকল্পে যুক্ত করতে পারেন

Global.asax ফাইলটিতে ax

    protected void Application_BeginRequest()
{
    string origin = Request.Headers.Get("Origin");
    if (Request.HttpMethod == "OPTIONS")
    {
        Response.AddHeader("Access-Control-Allow-Origin", origin);
        Response.AddHeader("Access-Control-Allow-Headers", "*");
        Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
        Response.StatusCode = 200;
        Response.End();
    }
    else
    {
        Response.AddHeader("Access-Control-Allow-Origin", origin);
        Response.AddHeader("Access-Control-Allow-Headers", "*");
        Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
    }
}


0

আপনি কর নীতিটি সংজ্ঞায়িত করতে ওউন মিডলওয়্যার ব্যবহার করতে পারেন যেখানে আপনি একাধিক কোর উত্স নির্ধারণ করতে পারেন

return new CorsOptions
        {
            PolicyProvider = new CorsPolicyProvider
            {
                PolicyResolver = context =>
                {
                    var policy = new CorsPolicy()
                    {
                        AllowAnyOrigin = false,
                        AllowAnyMethod = true,
                        AllowAnyHeader = true,
                        SupportsCredentials = true
                    };
                    policy.Origins.Add("http://foo.com");
                    policy.Origins.Add("http://bar.com");
                    return Task.FromResult(policy);
                }
            }
        };

-3

আপনার কেবল প্রয়োজন:

  • আপনার প্রকল্পে একটি Global.asax যুক্ত করুন,
  • <add name="Access-Control-Allow-Origin" value="*" />আপনার ওয়েবকনফিগ থেকে মুছুন ।
  • এরপরে, এটিকে Application_BeginRequestGlobal.asax এর পদ্ধতিতে যুক্ত করুন:

    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*");
    
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
        HttpContext.Current.Response.End();
    }
    

আমি এই সাহায্য আশা করি। আমার জন্য কাজ।


"...- উত্স: *" যোগ করা যখন আপনি শংসাপত্রের অনুমতি দেবেন তা ব্যতীত কাজ করে। আপনার যদি অনুমতি-শংসাপত্রগুলি সত্যে সেট হয়ে থাকে, তবে আপনাকে একটি ডোমেন নির্দিষ্ট করতে হবে (কেবল * নয়)। এই সমস্যাটি এখানেই রয়েছে। অন্যথায়, আপনি কেবল "... অনুমতি-শংসাপত্রগুলি: মিথ্যা" নির্দিষ্ট করতে পারেন এবং এটি দিয়েই হয়ে যেতে পারেন।
রিচার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.