আমি যা করার চেষ্টা করছি
আমার একটি ব্যাকএন্ড এএসপি.নেট কোর ওয়েব এপিআই একটি অ্যাজুর ফ্রি প্ল্যানে হোস্ট করা আছে (উত্স কোড: https://github.com/killerrin/PortLive-Backkend )।
আমার কাছে একটি ক্লায়েন্ট ওয়েবসাইট রয়েছে যা আমি এপিআই ব্যবহার করতে চাই। ক্লায়েন্ট অ্যাপ্লিকেশনটি আজুরে হোস্ট করা হবে না, বরং গিথুব পৃষ্ঠাগুলিতে বা অন্য যে ওয়েব হোস্টিং পরিষেবাদিতে আমার অ্যাক্সেস রয়েছে তাতে হোস্ট করা হবে। এই কারণে ডোমেন নামগুলি আপ আপ হবে না।
এটি খতিয়ে দেখলে আমার ওয়েব এপিআই সাইডে সিওআরএস সক্ষম করা দরকার, তবে আমি এখন বেশ কয়েক ঘন্টা ধরে সবকিছু নিয়ে চেষ্টা করেছি এবং এটি কাজ করতে অস্বীকার করছে।
আমি কীভাবে ক্লায়েন্ট সেটআপ করেছি এটি কেবল একটি সহজ ক্লায়েন্ট React.js এ লিখিত। আমি জ্যাকুরিতে এজেএক্সের মাধ্যমে এপিআইগুলি কল করছি। প্রতিক্রিয়া সাইট কাজ করে তাই আমি জানি যে এটি নয়। জেকারি এপিআই কলটি চেষ্টা 1 হিসাবে নিশ্চিত হওয়ার সাথে সাথে কাজ করে। আমি কলগুলি কীভাবে করব তা এখানে
var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
//alert(username + "|" + password + "|" + apiUrl);
$.ajax({
url: apiUrl,
type: "POST",
data: {
username: username,
password: password
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var authenticatedUser = JSON.parse(response);
//alert("Data Loaded: " + authenticatedUser);
if (onComplete != null) {
onComplete(authenticatedUser);
}
},
error: function (xhr, status, error) {
//alert(xhr.responseText);
if (onComplete != null) {
onComplete(xhr.responseText);
}
}
});
আমি যা চেষ্টা করেছি
চেষ্টা 1 - 'যথাযথ' উপায়
https://docs.microsoft.com/en-us/aspnet/core/security/cors
আমি এই টিউটোরিয়ালটি মাইক্রোসফ্ট ওয়েবসাইটে একটি টি তে অনুসরণ করেছি, এটি স্টার্টআপ.সিগুলিতে বিশ্বব্যাপী সক্ষম করার সমস্ত 3 টি বিকল্প ব্যবহার করে, প্রতিটি নিয়ামকের উপর সেট করে রেখে এবং প্রতিটি ক্রিয়ায় এটি চেষ্টা করে চলেছি।
এই পদ্ধতি অনুসরণ করে ক্রস ডোমেন কাজ করে তবে কেবলমাত্র একটি একক নিয়ামক (একাউন্টকন্ট্রোলারকে পোস্ট করুন) এর একক ক্রিয়ায়। অন্য কিছুর জন্য, Microsoft.AspNetCore.Cors
মিডলওয়্যার শিরোনাম সেট করতে অস্বীকার করে।
আমি Microsoft.AspNetCore.Cors
NUGET এর মাধ্যমে ইনস্টল করেছি এবং সংস্করণটি হ'ল1.1.2
এখানে এটি আমার কীভাবে স্টার্টআপ। সি-তে সেটআপ হয়
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// Add framework services.
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
});
...
...
...
}
// This method gets called by the runtime. Use this method to configure
//the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// Enable Cors
app.UseCors("MyPolicy");
//app.UseMvcWithDefaultRoute();
app.UseMvc();
...
...
...
}
আপনি দেখতে পাচ্ছেন, আমি যা বলেছি সবই করছি। আমি উভয় বার এমভিসির আগে কর্স যুক্ত করেছি এবং যখন এটি কাজ [EnableCors("MyPolicy")]
করে না তখন আমি প্রতিটি নিয়ামককে তেমনভাবে চেষ্টা করার চেষ্টা করেছি
[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller
চেষ্টা 2 - ব্রুট এটি জোর করে
https://andrewlock.net/adding-default-security-headers-in-asp-net-core/
পূর্ববর্তী প্রচেষ্টায় কয়েক ঘন্টা চেষ্টা করার পরে, আমি অনুভব করেছি যে আমি শিরোনামগুলি ম্যানুয়ালি সেট করার চেষ্টা করে এটিকে হস্তান্তর করার চেষ্টা করব, তাদের প্রতিটি প্রতিক্রিয়াতে চালিয়ে যেতে বাধ্য করব। আমি কীভাবে প্রতিটি প্রতিক্রিয়ায় ম্যানুয়ালি শিরোনাম যুক্ত করব এই টিউটোরিয়ালটি অনুসরণ করে এটি করেছি।
এগুলি আমি যুক্ত করেছি
.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")
এগুলি আমি চেষ্টা করেছি এমন অন্য শিরোনাম
.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")
এই পদ্ধতির সাহায্যে ক্রস সাইটের শিরোনামগুলি যথাযথভাবে প্রয়োগ করা হচ্ছে এবং তারা আমার বিকাশকারী কনসোল এবং পোস্টম্যানে প্রদর্শিত হবে। সমস্যা কিন্তু এটি পাসের যখন Access-Control-Allow-Origin
চেক WebBrowser মধ্যে (আমি বিশ্বাস করি) একটি হিসি ফিট ছোঁড়ার Access-Control-Allow-Headers
জানায়415 (Unsupported Media Type)
সুতরাং নিষ্ঠুর বল পদ্ধতিটিও কাজ করে না
পরিশেষে
কেউ কি এই কাজ করতে পেরেছেন এবং হাত ধার দিতে পারেন, বা আমাকে সঠিক দিকে নির্দেশ করতে সক্ষম হয়েছেন?
সম্পাদনা
তাই এপিআই কলগুলি পেতে, আমাকে জিকুয়ারি ব্যবহার বন্ধ করতে হয়েছে এবং একটি খাঁটি জাভাস্ক্রিপ্ট XMLHttpRequest
ফর্ম্যাটে স্যুইচ করতে হয়েছিল ।
চেষ্টা ঘ
আমি Microsoft.AspNetCore.Cors
মাইন্ডিংডাটার উত্তর অনুসরণ করে কাজটি পরিচালনা করতে সক্ষম হয়েছি, আগে থাকা Configure
পদ্ধতিটির বাইরে ।app.UseCors
app.UseMvc
তদ্ব্যতীত, options.AllowAnyOrigin()
ওয়াইল্ডকার্ড সমর্থনের জন্য জাভাস্ক্রিপ্ট এপিআই সলিউশনের সাথে মিশ্রিত করার সাথে সাথে কাজ করাও শুরু করে।
চেষ্টা 2
সুতরাং আমি চেষ্টা করতে চেষ্টা করেছি 2 (এটি জোর করে জোর করে) কাজ করার জন্য ... একমাত্র ব্যতিক্রম ব্যতীত যে ওয়াইল্ডকার্ড Access-Control-Allow-Origin
কাজ করে না এবং যেমন আমাকে এর মধ্যে অ্যাক্সেস আছে এমন ডোমেনগুলি ম্যানুয়ালি সেট করতে হবে।
এটি স্পষ্টতই আদর্শ নয় যেহেতু আমি কেবল এই ওয়েবএপিআইটি সবার জন্য উন্মুক্ত করতে চাই, তবে এটি কমপক্ষে একটি পৃথক সাইটে আমার পক্ষে কাজ করে, যার অর্থ এটি একটি শুরু
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
.AddDefaultSecurePolicy()
.AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
.AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));
415 (Unsupported Media Type)
সমস্যার জন্য, একটিContent-Type
অনুরোধ শিরোনাম সেট করুনapplication/json
।